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;

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

  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/jiangjianzhu/p/5549556.html
Copyright © 2011-2022 走看看