zoukankan      html  css  js  c++  java
  • 双向一对多的关联映射

    1、 学生表student 和年级表grade

    2、类Student Grade

    Student:

    1 public class Student {
    2     private int id;
    3     private String name;
    4     private int age;
    5     private Grade grade;
    6         //get…set
    7 }

    Grade:

    1 public class Grade {
    2     private int id;
    3     private String name;
    4     private Set<Student> students = new HashSet<Student>(0);    //get…set
    5 }

    3、 映射文件

    Grade.hbm.xml

     1 <hibernate-mapping package="cn.siggy.pojo">
     2     <class name="Grade">
     3         <id name="id">
     4             <generator class="native"></generator>
     5         </id>
     6         <property name="name"/>
     7         <!-- set是 Grade中的集合属性  name属性名称 -->
     8         <set name="students">
     9             <!-- key表示外键  column外键列名-->
    10             <key column="grade_id"></key>
    11             <!-- one-to-many 一对多  类Grade 中  students 所表示类型 -->
    12             <one-to-many class="Student"/>
    13         </set>
    14     </class>
    15 </hibernate-mapping>

    Student.hbm.xml

     1 <hibernate-mapping package="cn.siggy.pojo">
     2     <class name="Student">
     3         <id name="id">
     4             <generator class="native"></generator>
     5         </id>
     6         <property name="name"/>
     7         <property name="age"/>
     8         <many-to-one name="grade" class="Grade" column="grade_id" not-null="true"></many-to-one>
     9     </class>
    10 </hibernate-mapping>

    4、 测试代码

    @Test
        public void testSave() throws HibernateException, SerialException, SQLException{
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtil.getSession();
                tx = session.beginTransaction();
                Grade grade = new Grade();
                grade.setName("基础");
                
                Student stu = new Student();
                stu.setName("张三疯");
                stu.setAge(22);
                stu.setGrade(grade);
                Student stu1 = new Student();
                stu1.setName("老王");
                stu1.setAge(23);
                stu1.setGrade(grade);
                //关联
                //保存数据的顺序 是根据外键的配置来决定的
                //如果外键不能为null,那么先保存一的一端
                //如果外键可以为null,则可以随意保存
                session.save(grade);
                session.save(stu);
                session.save(stu1);
                
                tx.commit();
                
            }catch (HibernateException e) {
                if(tx!=null)
                    tx.rollback();
                e.printStackTrace();
                throw e;
            }finally{
                HibernateUtil.closeSession();
            }
        }
        @Test
        public void testGet(){
            Session session = null;
            Transaction tx = null;
            try{
                session = HibernateUtil.getSession();
                tx = session.beginTransaction();
                //取数据
                Grade grade = (Grade)session.get(Grade.class, 2);
                System.out.println("gradeName="+grade.getName());
                System.out.println("grade所对应的多的一端的数据");
                Iterator<Student> iter = grade.getStudents().iterator();
                for(;iter.hasNext();){
                    Student temp = iter.next();
                    System.out.println("name="+temp.getName()+"	age="+temp.getAge());
                }
                System.out.println("========================");
                Student stu = (Student)session.get(Student.class, 1);
                System.out.println("studentname="+stu.getName()+"   gradeName="+stu.getGrade().getName());
                tx.commit();
            }catch (HibernateException e) {
                if(tx!=null)
                    tx.rollback();
                e.printStackTrace();
                throw e;
            }finally{
                HibernateUtil.closeSession();
            }
        }

    总结:在双向的一对多关联映射中,注意一的一端的配置:<key>中不用指定非空not-null;

    如果想要一的一端来维护关系,那么在多的一端不用指定关联列非空。

  • 相关阅读:
    Teamwork——Week4 团队分工和预估项目时间
    Team Homework #3 软件工程在北航——IloveSE
    《DWZ笔记一》<select>动态联动菜单
    asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现
    经典SQL语句基础50题
    打垮美国发起的这场经济战争[转自由凤凰论坛]
    为什么要删我贴呢?
    5年,从5元到500万,我的创业经历(转自VFP精英站,未完)
    发现大家对销售感兴趣,再来两则(二)
    你们知道美国是怎么报道别人的灾难吗?
  • 原文地址:https://www.cnblogs.com/jiangjianzhu/p/5549556.html
Copyright © 2011-2022 走看看