首页 > 代码库 > hibernate建表一对多

hibernate建表一对多

级联操作,操作class对象的时候 级联操作 student

Classes.java文件

 1 package cn.itcast.hiberate.sh.domain;
 2 
 3 import java.util.Set;
 4 
 5 public class Classes {
 6     private Long cid;
 7     private String cname;
 8     private String description;
 9     public String getDescription() {
10         return description;
11     }
12     public Classes(String cname, String description) {
13         super();
14         this.cname = cname;
15         this.description = description;
16     }
17     public Classes(Long cid, String cname, String description,
18             Set<Student> students) {
19         super();
20         this.cid = cid;
21         this.cname = cname;
22         this.description = description;
23         this.students = students;
24     }
25     public Classes() {
26         // TODO Auto-generated constructor stub
27     }
28     public void setDescription(String description) {
29         this.description = description;
30     }
31     private Set<Student> students;
32     public Long getCid() {
33         return cid;
34     }
35     public void setCid(Long cid) {
36         this.cid = cid;
37     }
38     public String getCname() {
39         return cname;
40     }
41     public void setCname(String cname) {
42         this.cname = cname;
43     }
44     public Set<Student> getStudents() {
45         return students;
46     }
47     public void setStudents(Set<Student> students) {
48         this.students = students;
49     }
50     
51 }

Classes.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.Classes">
 6         <id name="cid" length="5" type="java.lang.Long">
 7             <generator class="increment"></generator>
 8         </id>
 9         <property name="cname" length="20" type="java.lang.String"></property>
10         
11         <property name="description" length="100" type="java.lang.String"></property>
12         <!-- 
13             set元素对应类中的set集合
14             通过set元素使classes表与student表建立关联
15                key是通过外键的形式让两张表建立关联
16                one-to-many是通过类的形式让两个类建立关联
17             
18             cascade 级联
19                save-update
20                    1、当 保存班级的时候,对学生进行怎么样的操作
21                         如果学生对象在数据库中没有对应的值,这个时候会执行save操作
22                         如果学生对象在数据库中有对应的值,这个时候会执行update操作
23                delete
24                all
25             inverse  维护关系
26                true      不维护关系     
27                false     维护关系
28                default   false
29          -->
30         <set name="students" cascade="save-update" inverse="true">
31             <!-- 
32                 key是用来描述外键
33              -->
34             <key>
35                 <column name="cid"></column>
36             </key>
37             <one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>
38         </set>
39     </class>
40 </hibernate-mapping>

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     public Long getSid() {
 8         return sid;
 9     }
10     public void setSid(Long sid) {
11         this.sid = sid;
12     }
13     public Student(String sname, String description) {
14         super();
15         this.sname = sname;
16         this.description = description;
17     }
18     public Student() {
19         // TODO Auto-generated constructor stub
20     }
21     public String getSname() {
22         return sname;
23     }
24     public void setSname(String sname) {
25         this.sname = sname;
26     }
27     public String getDescription() {
28         return description;
29     }
30     public void setDescription(String description) {
31         this.description = description;
32     }
33     
34 }

Test.java

  1 package cn.itcast.hibernate.sh.test;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashSet;
  5 import java.util.List;
  6 import java.util.Set;
  7 
  8 import org.hibernate.Session;
  9 import org.hibernate.Transaction;
 10 import org.hibernate.annotations.Type;
 11 import org.junit.Test;
 12 
 13 import cn.itcast.hiberate.sh.domain.Classes;
 14 import cn.itcast.hiberate.sh.domain.Student;
 15 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
 16 
 17 /**
 18  * 1、新建一个班级
 19  * 2、新建一个学生
 20  * 3、新建一个班级的时候同时新建一个学生
 21  * 4、已经存在一个班级,新建一个学生,建立学生与班级之间的关系
 22  * 5、已经存在一个学生,新建一个班级,把学生加入到该班级
 23  * 6、把一个学生从一个班级转移到另一个班级
 24  * 7、解析一个班级和一个学生之间的关系
 25  * 8、解除一个班级和一些学生之间的关系
 26  * 9、解除该班级和所有的学生之间的关系
 27  * 10、已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
 28  * 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
 29  * 12、删除学生
 30  * 13、删除班级
 31  *     删除班级的时候同时删除学生
 32  *     在删除班级之前,解除班级和学生之间的关系
 33  * @author Think
 34  *
 35  */
 36 public class OneToManySingleTest extends HiberanteUtils{
 37     @Test
 38     public void testSaveClasses(){
 39         Session session = sessionFactory.openSession();
 40         Transaction transaction = session.beginTransaction();
 41         Classes classes = new Classes();
 42         classes.setCname("传智上海云一期");
 43         classes.setDescription("很牛");
 44         session.save(classes);
 45         transaction.commit();
 46         session.close();
 47     }
 48     
 49     
 50     
 51     @Test
 52     public void testSaveStudent(){
 53         Session session = sessionFactory.openSession();
 54         Transaction transaction = session.beginTransaction();
 55         Student student = new Student();
 56         student.setSname("班长");
 57         student.setDescription("老牛:很牛");
 58         session.save(student);
 59         transaction.commit();
 60         session.close();
 61     }
 62     
 63     @Test
 64     public void testSaveClasses_Student(){
 65         Session session = sessionFactory.openSession();
 66         Transaction transaction = session.beginTransaction();
 67         
 68         Classes classes = new Classes();
 69         classes.setCname("传智上海云二期:");
 70         classes.setDescription("很牛X");
 71         
 72         Student student = new Student();
 73         student.setSname("班长");
 74         student.setDescription("老牛:很牛X");
 75         
 76         session.save(student);
 77         session.save(classes);
 78         transaction.commit();
 79         session.close();
 80     }
 81     
 82     /**
 83      * 在保存班级的时候,级联保存学生
 84      */
 85     @Test
 86     public void testSaveClasses_Cascade_Student_Save(){
 87         Session session = sessionFactory.openSession();
 88         Transaction transaction = session.beginTransaction();
 89         
 90         Classes classes = new Classes();
 91         classes.setCname("传智上海云三期:");
 92         classes.setDescription("很牛XX");
 93         
 94         Student student = new Student();
 95         student.setSname("班长");
 96         student.setDescription("老牛:很牛XX");
 97         
 98         Set<Student> students = new HashSet<Student>();
 99         students.add(student);
100         
101         //建立classes与student之间的关联
102         classes.setStudents(students);
103         session.save(classes);
104         transaction.commit();
105         session.close();
106     }
107     
108     @Test
109     public void testSaveClasses_Cascade_Student_Update(){
110         Session session = sessionFactory.openSession();
111         Transaction transaction = session.beginTransaction();
112         
113         Classes classes = new Classes();
114         classes.setCname("传智上海云四期:");
115         classes.setDescription("很牛XXX");
116         
117         Student student = (Student)session.get(Student.class, 1L);
118         
119         student.setSname("班秘");
120         
121         Set<Student> students = new HashSet<Student>();
122         students.add(student);
123         
124         classes.setStudents(students);
125     
126         session.save(classes);
127         transaction.commit();
128         session.close();
129     }
130     
131     @Test
132     public void testUpdateClasses_Cascade_Student_Save(){
133         Session session = sessionFactory.openSession();
134         Transaction transaction = session.beginTransaction();
135         Classes classes = (Classes)session.get(Classes.class, 5L);
136         Student student = new Student();
137         student.setSname("班花");
138         student.setDescription("稀有人物");
139         classes.getStudents().add(student);
140         transaction.commit();
141         session.close();
142     }
143     
144     @Test
145     public void testUpdateClasses_Cascade_Student_Update(){
146         Session session = sessionFactory.openSession();
147         Transaction transaction = session.beginTransaction();
148         Classes classes = (Classes)session.get(Classes.class, 5L);
149         Set<Student> students = classes.getStudents();//为cid为5的班级的所有的学生
150 //        for(Student student:students){
151 //            student.setDescription("压力山大");
152 //        }
153         transaction.commit();
154         session.close();
155     }
156     
157     /**
158      * 一个错误的演示
159      */
160     @Test
161     public void testSaveClasses_Cascade_Student_Save_Error(){
162         Session session = sessionFactory.openSession();
163         Transaction transaction = session.beginTransaction();
164         
165         Classes classes = new Classes();
166         classes.setCname("传智上海云六期:");
167         classes.setDescription("很牛XXXXXX");
168         
169         Student student = new Student();
170         student.setSname("班长XXXXXX");
171         student.setDescription("老牛:很牛XXXXXX");
172         
173         Set<Student> students = new HashSet<Student>();
174         students.add(student);
175         
176         //建立classes与student之间的关联
177         classes.setStudents(students);
178         session.save(classes);
179         transaction.commit();
180         session.close();
181     }
182     
183     
184     /**
185      * 已经存在一个班级,新建一个学生,建立学生与班级之间的关系
186      *    通过更新班级级联保存学生  cascade
187      *    建立班级和学生之间的关系  inverse
188      */
189     @Test
190     public void testSaveStudent_R_1(){
191         Session session = sessionFactory.openSession();
192         Transaction transaction = session.beginTransaction();
193         Student student = new Student();
194         student.setSname("技术班长");
195         student.setDescription("大神");
196         Classes classes = (Classes)session.get(Classes.class, 1L);
197         
198         classes.getStudents().add(student);
199         
200         transaction.commit();
201         session.close();
202     }
203     
204     /**
205      *     Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
206         Hibernate: select max(sid) from Student
207         Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
208         Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
209         更新关系的操作
210         Hibernate: update Student set cid=? where sid=?
211      */
212     @Test
213     public void testSaveStudent_R_2(){
214         Session session = sessionFactory.openSession();
215         Transaction transaction = session.beginTransaction();
216         Student student = new Student();
217         student.setSname("技术班长");
218         student.setDescription("大神");
219         Classes classes = (Classes)session.get(Classes.class, 1L);
220         
221         session.save(student);
222         
223         classes.getStudents().add(student);
224         
225         transaction.commit();
226         session.close();
227     }
228     
229     /**
230      * 已经存在一个学生,新建一个班级,把学生加入到该班级
231      */
232     @Test
233     public void testSaveClasses_R(){
234         Session session = sessionFactory.openSession();
235         Transaction transaction = session.beginTransaction();
236         
237         Classes classes = new Classes();
238         classes.setCname("老毕基础加强班");
239         classes.setDescription("必看,杀手锏");
240         
241         Student student = (Student)session.get(Student.class, 2L);
242         Set<Student> students = new HashSet<Student>();
243         students.add(student);
244         classes.setStudents(students);
245         
246         session.save(classes);
247         transaction.commit();
248         session.close();
249     }
250     
251     /**
252      * 把一个学生从一个班级转移到另一个班级
253      *     Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
254         Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
255         Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_, student0_.description as descript3_1_0_ from Student student0_ where student0_.sid=?
256         Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
257         Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
258         Hibernate: update Student set cid=null where cid=? and sid=?
259         Hibernate: update Student set cid=? where sid=?
260      */
261     @Test
262     public void testTransformClass(){
263         Session session = sessionFactory.openSession();
264         Transaction transaction = session.beginTransaction();
265         //Classes classes5 = (Classes)session.get(Classes.class, 5L);
266         Classes classes6 = (Classes)session.get(Classes.class, 6L);
267         Student student = (Student)session.get(Student.class, 1L);
268         //classes5.getStudents().remove(student);
269         classes6.getStudents().add(student);
270         transaction.commit();
271         session.close();
272     }
273     
274     /**
275      * 解除一个班级和一些学生之间的关系
276      */
277     
278     @Test
279     public void testR_Some(){
280         Session session = sessionFactory.openSession();
281         Transaction transaction = session.beginTransaction();
282         Classes classes = (Classes)session.get(Classes.class, 1L);
283         Set<Student> students = classes.getStudents();
284 //        for(Student student:students){
285 //            if(student.getSid().longValue()==6||student.getSid().longValue()==7){
286 //                students.remove(student);
287 //            }
288 //        }
289         //set-->list
290         List<Student> sList = new ArrayList<Student>(students);
291         for(int i=0;i<sList.size();i++){
292             if(sList.get(i).getSid().longValue()==6||sList.get(i).getSid().longValue()==7){
293                 sList.remove(sList.get(i));
294                 i--;
295             }
296         }
297         
298         students = new HashSet<Student>(sList);
299         classes.setStudents(students);
300         /**
301          * 增强for循环只能修改一次
302          *   1、用普通的for循环
303          *   2、新建一个set集合,把原来的set集合要保留的数据存放到新的set集合中
304          */
305         transaction.commit();
306         session.close();
307     }
308     
309     /*
310      * classes.setStudents(null);直接把班级针对student的集合设置为null
311      */
312     @Test
313     public void testRealseAll(){
314         Session session = sessionFactory.openSession();
315         Transaction transaction = session.beginTransaction();
316         Classes classes = (Classes)session.get(Classes.class, 1L);
317 //        Set<Student> students = classes.getStudents();
318 //        students.clear();
319         classes.setStudents(null);
320         transaction.commit();
321         session.close();
322     }
323     
324     /**
325      * 已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
326      * 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
327      */
328     
329     @Test
330     public void testDeleteStudent(){
331         Session session = sessionFactory.openSession();
332         Transaction transaction = session.beginTransaction();
333         Student student = (Student)session.get(Student.class, 8L);
334         session.delete(student);
335         transaction.commit();
336         session.close();
337     }
338     
339     
340     //这个时候必须保证inverse="false"才能保证能够维持 Classes和Student之间的关系, 如果为inverse="true"并且cascade="save-update"会报错,外键         //约束错误
341     @Test
342     public void testDeleteClasses(){
343         Session session = sessionFactory.openSession();
344         Transaction transaction = session.beginTransaction();
345         Classes classes = (Classes)session.get(Classes.class, 5L);
346         //classes.setStudents(null);        //因为inverse="true"所以,这句话对数据库没作用,没有关联关系了
347         session.delete(classes);
348         transaction.commit();
349         session.close();
350     }
351     
    //这个时候用到了 Classes.hbm.xml中的级联属性 cascade="delete"(用all就包括它们两个属性)inverse="true"也是没有关系的
352 @Test
353 public void testDeleteClasses_Cascade(){
354 Session session = sessionFactory.openSession();
355         Transaction transaction = session.beginTransaction(); 
356 Classes classes = (Classes)session.get(Classes.class, 5L);
357 session.delete(classes);
358 transaction.commit();
359 session.close();
360 }
361

362 }