• 双向一对多的关联映射


    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;

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

  • 相关阅读:
    二级评论
    AFN上传数组
    简单播放音频
    好久不见~~ iOS开发动画(Animation)总结
    iOS开发中的单元测试(一)
    在 Xcode 中进行自动化测试 (2/2)
    在 Xcode 中进行自动化测试 (1/2)
    iOS中Bitcode的介绍及配置
    大牛博客
    关于iOS Push Notification的响应问题
  • 原文地址:https://www.cnblogs.com/jiangjianzhu/p/5549556.html
Copyright © 2020-2023  润新知