Hibernate: 关联关系一对多映射

gitHub

  • 一对多单向映射  (Student 获取Class )
  1. 新建Student 类, Class 类, 设置Id, name; get, set方法
  2. 在Student 类下增添 private Class c;
  3. Student.hbm.xml中 添加
    1. <many-to-one name="c" column="classId" class="com.base.model.Class"></many-to-one>  //多对一
    2.  1 <?xml version="1.0"?>
       2 <!DOCTYPE hibernate-mapping PUBLIC
       3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
       4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
       5 
       6 <hibernate-mapping package="com.base.model">
       7 
       8     <class name="Student" table="t_student">    <!-- 类名与对应的数据表名 -->
       9         <id name="id" column="stuId">            <!-- 字段名,设置主键 -->
      10             <generator class="native"/>
      11         </id>
      12         <property name="name"/>            <!--普通字段  -->
      13         
      14         <many-to-one name="c" column="classId" class="com.base.model.Class"></many-to-one>  //多对一
      15     </class>
      16 
      17 </hibernate-mapping>
  4. 设置Class.hbm.xml
    1.  1 <?xml version="1.0"?>
       2 <!DOCTYPE hibernate-mapping PUBLIC
       3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
       4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
       5 
       6 <hibernate-mapping package="com.base.model">
       7 
       8     <class name="Class" table="t_class">    <!-- 类名与对应的数据表名 -->
       9         <id name="id" column="classId">            <!-- 字段名,设置主键 -->
      10             <generator class="native"/>
      11         </id>
      12         <property name="name" column="className"/>            <!--普通字段  -->
      13     </class>
      14 
      15 </hibernate-mapping>
  5. 添加Hibernate.cfg.xml
    1. 在<session-factory>标签里添加
    2. 1     <mapping resource="com/base/model/Student.hbm.xml"/>    <!-- xml版使用resource -->
      2     <mapping resource="com/base/model/Class.hbm.xml"/>    <!-- xml版使用resource -->
  6. 设置测试类
    1.  1 public class StudentCalssTest2Test {
       2     SessionFactory sessionFactory = HibernateUtil.getSessionFactory();    //由于每个步骤都会用到所以移到外面来
       3     Session session;
       4     @Before
       5     public void setUp() throws Exception {
       6         session = sessionFactory.openSession();    //生成一个新的session
       7         session.beginTransaction();    //开启事物
       8     }
       9 
      10     @After
      11     public void tearDown() throws Exception {
      12         session.getTransaction().commit();    //提交事务
      13         session.close();                    //关闭session
      14     }
      15 
      16     @Test
      17     public void testTestAdd() {
      18         //简单添加示例
      19         Class c = new Class();
      20         c.setName("2013级");
      21         session.save(c);
      22         
      23         Student s1 = new Student();        //创建一个学生
      24         s1.setName("zhansan");            //设置名称
      25         s1.setC(c);
      26         session.save(s1);                //保存学生
      27         
      28         Student s2 = new Student();        //创建一个学生
      29         s2.setName("李四");            //设置名称
      30         s2.setC(c);
      31         session.save(s2);                //保存学生
      32     }
        }
  • 一对多双向映射 (Class 获取Student )
  1. 使用set集合在Class 类中添加Student 属性
    1. 1 private Set<Student> students = new HashSet<Student>();    //班级对应的学生
    2. 添加get set
  2. 在Class.hbm.xml,<class>中添加
    1. 1 <set name="students" cascade="save-update">        <!-- 对应的多对一映射, cascade: 级联(可以在测试类中不需要使用session.save(c);) -->
      2             <key column="classId"></key>    <!-- 对应的外键 -->
      3             <one-to-many class="com.base.model.Student"/>    <!-- 设置一对多的相对类 -->
      4 </set>
  3. 在测试类中添加student 到set 中
    1.  1     public void testTestAdd() {
       2         //简单添加示例
       3         Class c = new Class();
       4         c.setName("2013级");
       5         //session.save(c);                //因为使用了级联,可以不写save
       6         
       7         Student s1 = new Student();        //创建一个学生
       8         s1.setName("zhansan");            //设置名称
       9         s1.setC(c);
      10         //session.save(s1);                //保存学生
      11         
      12         Student s2 = new Student();        //创建一个学生
      13         s2.setName("李四");            //设置名称
      14         s2.setC(c);
      15         //session.save(s2);                //保存学生
      16         
      17         c.getStudents().add(s1);
      18         c.getStudents().add(s2);
      19         
      20         session.save(c);
      21     }
  4. 通过Class 打印学生
    1.  1     /**
       2      * 通过Class 打印学生
       3      */
       4     @Test
       5     public void getStudentByClass(){
       6         Class c = (Class)session.get(Class.class, Integer.valueOf(1));    //取得Class对象
       7         Set<Student> students = c.getStudents();
       8         for (Iterator iterator = students.iterator(); iterator.hasNext();) {
       9             Student student = (Student) iterator.next();
      10             System.out.println(student);
      11             
      12         }
      13     }
  • 一对多 双向自身关联关系映射
  1. 在model 中设置Node
    1.   定义四条属性
    2. 1     private int id;
      2     private String name;
      3     private Node parentNode;    //父节点
      4     private Set<Node> childNodes = new HashSet<Node>();    //设置子节点
  2. 在Node.hbm.xml
    1.  1     <class name="Node" table="t_node">    <!-- 类名与对应的数据表名 -->
       2         <id name="id" column="nodeId">            <!-- 字段名,设置主键 -->
       3             <generator class="native"/>
       4         </id>
       5         <property name="name" column="nodeName"/>            <!--普通字段  -->
       6         
       7         <many-to-one name="parentNode" column="parentId" class="com.base.model.Node" cascade="save-update"></many-to-one>
       8         
       9         <set name="childNodes"  inverse="true">                <!-- 对应的一对多映射 -->
      10             <key column="parentId"></key>    <!-- 对应的外键,与many-to-one的name对应 -->
      11             <one-to-many class="com.base.model.Node"/>    <!-- 设置一对多的相对类 -->
      12         </set>
      13     </class>
  3. 测试类中
    1.   
       1     @Test
       2     public void TestAdd() {
       3         
       4         Node node = new Node();
       5         node.setName("根节点");
       6         
       7         Node subNode1 = new Node();
       8         subNode1.setName("子节点1");
       9         
      10         Node subNode2 = new Node();
      11         subNode2.setName("子节点2");
      12         
      13         subNode1.setParentNode(node);
      14         subNode2.setParentNode(node);
      15         
      16         session.save(subNode1);
      17         session.save(subNode2);
      18         
      19     }

       

 

posted @ 2014-11-22 07:40  四点水这  阅读(193)  评论(0编辑  收藏  举报