首页 > 代码库 > hibernate建表 一对多 多的一方控制一的一方

hibernate建表 一对多 多的一方控制一的一方

一对多 单向
<one-to-many>
通过calss操作student 外键在student表中,所以外键由student维护
<many-to-one>
通过student操作class 外键在student中,所以自动维护student的外键 没有inverse属性

建议用多对一这个方向的操作效率比较高

Student.java

 1 package cn.itcast.hiberate.sh.domain;
 2 
 3 public class Student {
 4     private Long sid;
 5     private String sname;
 6     private String description;
 7     Classes classes;
 8     
 9     public Classes getClasses() {
10         return classes;
11     }
12     public void setClasses(Classes classes) {
13         this.classes = classes;
14     }
15     public Long getSid() {
16         return sid;
17     }
18     public void setSid(Long sid) {
19         this.sid = sid;
20     }
21     public Student(String sname, String description) {
22         super();
23         this.sname = sname;
24         this.description = description;
25     }
26     public Student() {
27         // TODO Auto-generated constructor stub
28     }
29     public String getSname() {
30         return sname;
31     }
32     public void setSname(String sname) {
33         this.sname = sname;
34     }
35     public String getDescription() {
36         return description;
37     }
38     public void setDescription(String description) {
39         this.description = description;
40     }
41     
42 }

Student.hbm.xml 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping>
 5     <class name="cn.itcast.hiberate.sh.domain.Student">
 6         <id name="sid" length="5">
 7             <generator class="increment"></generator>
 8         </id>
 9         <property name="sname" length="20"></property>
10         <property name="description" length="100"></property>
11         <!-- 
12             多对一
13               column 外键
14          -->
15         <many-to-one name="classes" class="cn.itcast.hiberate.sh.domain.Classes" column="cid" cascade="save-update"></many-to-one>
16     </class>
17 </hibernate-mapping>

test.java语句

 1 package cn.itcast.hibernate.sh.test;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import org.hibernate.Session;
 7 import org.hibernate.Transaction;
 8 import org.junit.Test;
 9 
10 import cn.itcast.hiberate.sh.domain.Classes;
11 import cn.itcast.hiberate.sh.domain.Student;
12 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
13 
14 /**
15  * 3、新建一个班级的时候同时新建一个学生
16  * 4、已经存在一个班级,新建一个学生,建立学生与班级之间的关系
17  * 5、已经存在一个学生,新建一个班级,把学生加入到该班级
18  * 6、把一个学生从一个班级转移到另一个班级
19  * 7、解析一个班级和一个学生之间的关系
20  * 8、解除一个班级和一些学生之间的关系
21  * 9、解除该班级和所有的学生之间的关系
22  * 10、已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
23  * 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
24  * 12、删除学生
25  * 13、删除班级
26  *     删除班级的时候同时删除学生
27  *     在删除班级之前,解除班级和学生之间的关系
28  * @author Think
29  *
30  */
31 public class OneToManyTest extends HiberanteUtils{
32     @Test
33     public void testSaveStudent_Cascade_Classes_Save(){
34         Session session = sessionFactory.openSession();
35         Transaction transaction = session.beginTransaction();
36         Student student = new Student();
37         student.setSname("班秘");
38         student.setDescription("很神秘的一个工作");
39         
40         Classes classes = new Classes();
41         classes.setCname("老毕亲子班");
42         classes.setDescription("都是老毕的亲戚");
43         
44         student.setClasses(classes);
45 //        Set<Student> students = new HashSet<Student>();
46 //        students.add(student);
47 //        
48 //        classes.setStudents(students);
49         session.save(student);
50         
51         transaction.commit();
52         session.close();
53     }
54     
55     
56     /**
57      * 一对多,从多的一端维护关系效率比较高
58      */
59     @Test
60     public void testSaveStudent_R(){
61         Session session = sessionFactory.openSession();
62         Transaction transaction = session.beginTransaction();
63         
64         Student student = new Student();
65         student.setSname("这个人");
66         student.setDescription("很好");
67         
68         Classes classes = (Classes)session.get(Classes.class, 2L);
69         student.setClasses(classes);
70         
71        //Set<Student> students = new HashSet<Student>();
72        //students.add(student);
73         
74         //classes.getStudents().add(student);//在hibernate内部查看的是classes.hbm.xml
75         
76         session.save(student);//在hibernate内部查看的是Student.hbm.xml
77         transaction.commit();
78         session.close();
79     }
80     
81     @Test
82     public void testRelese_R(){
83         Session session = sessionFactory.openSession();
84         Transaction transaction = session.beginTransaction();
85         Classes classes = (Classes)session.get(Classes.class, 2L);
86         Student student7 = (Student)session.get(Student.class, 7L);
87         Student student8 = (Student)session.get(Student.class, 8L);
88         student7.setClasses(null);
89         student8.setClasses(null);

      //也可以用以下替代

        Classes classes=(Classes) session.get(Classes.class, 9L);        Set<Student> stu=classes.getStudents();        for(Student s:stu)          s.setClasses(null);



90         transaction.commit();
91         session.close();
92     }
93 }