Hello Word

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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()+"\tage="+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;

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

 

posted on 2016-06-01 14:43  该名称已被使用  阅读(249)  评论(0编辑  收藏  举报