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     }

       

 

你可能感兴趣的:(Hibernate)