Hibernate 一对多单向关联Demo

以Classes[班级]和Student[学生]为例的Demo

Classes .java

public class Classes implements Serializable {
    private long Cid;
    private String Cname;
    private String Cdesc;
    
    private Set<Student> students;
    //get和set   
}
Student .java

public class Student implements Serializable {
    private long Sid;
    private String Sname;
    private String Sdesc;
//get和set
}

映射文件:

 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.test.test.Classes" table="classes">
 6         <id name="Cid" type="java.lang.Long" length="5">
 7             <column name="Cid"></column>
 8             <generator class="increment"></generator>
 9         </id>
10         <property name="Cname" type="java.lang.String" length="20"></property>
11         <property name="Cdesc" type="java.lang.String" length="50"></property>
12         
13         <!-- 
14             set元素和类中的set集合对应
15               *  从外键的角度建立classes与student之间的关系
16               *  从类与类的角度建立classes与student之间的关系
17             cascade级联
18                 inverse是用来维护关系的
19                     *  要么是一对多的关系
20                     *  要么多对多的关系
21                     *  谁来维护关系
22             inverse所在的映射文件对应的持久化对象维护关系
23                 默认值是false  表明维护关系
24                     true   表明不维护关系
25          -->
26         <set name="students" cascade="all">
27             <!-- 
28                 key是用来描述外键
29                  column就代表外键的名字
30              -->
31              <key>
32                  <column name="Cid"></column>
33              </key>
34              <!-- 
35                  classes和哪个对象进行关联
36               -->
37              <one-to-many class="cn.test.test.Student"/>
38         </set>
39         
40     </class>
41 </hibernate-mapping>

 

 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.test.test.Student" table="student">
 6         <id name="Sid" type="java.lang.Long" length="5">
 7             <column name="Sid"></column>
 8             <generator class="increment"></generator>
 9         </id>
10         <property name="Sname" type="java.lang.String" length="20"></property>
11         <property name="Sdesc" type="java.lang.String" length="50"></property>
12     </class>
13 </hibernate-mapping>

 

 

技术分享
  1 package cn.test.test;
  2 
  3 import java.util.HashSet;
  4 import java.util.List;
  5 import java.util.Set;
  6 
  7 import javax.crypto.interfaces.PBEKey;
  8 
  9 import org.hibernate.Session;
 10 import org.hibernate.SessionFactory;
 11 import org.hibernate.Transaction;
 12 import org.hibernate.cfg.Configuration;
 13 import org.junit.Test;
 14 
 15 public class DoTest {
 16     /**
 17      * 1、保存班级
 18      * 2、保存学生
 19      * 3、保存班级的时候同时保存学生
 20      * 4、保存班级的时候同时保存学生,并且建立班级和学生之间的关系
 21      * 5、已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系
 22      * 6、已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系
 23      * 7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
 24      * 8、已经存在一个学生,解除该学生和该学生所在班级之间的关系
 25      * 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
 26      * 10、解除该班级和所有的学生之间的关系
 27      * 11、删除班级
 28      *      *
 29      *          *  解除该班级和所有的学生之间的关系
 30      *          *  删除该班级
 31      *      *   
 32      *          删除班级的同时删除学生
 33      * 12、删除学生
 34      *      同删除班级
 35      */
 36     
 37     private static SessionFactory sessionFactory;
 38     static{
 39         Configuration configuration=new Configuration();
 40         configuration.configure();
 41         sessionFactory=configuration.buildSessionFactory();
 42     }
 43     
 44     //1、保存班级
 45     @Test
 46     public void testSaveClasses(){
 47         Session session=sessionFactory.openSession();
 48         Transaction transaction= session.beginTransaction();
 49         Classes classes=new Classes();
 50         classes.setCname("Tom");
 51         classes.setCdesc("1234567890-");
 52         session.save(classes);
 53         transaction.commit();
 54         session.close();
 55     }
 56     //2、保存学生
 57     @Test
 58     public void testSaveStudents(){
 59         Session session=sessionFactory.openSession();
 60         Transaction transaction= session.beginTransaction();
 61         Student student=new Student();
 62         student.setSname("屌丝班");
 63         student.setSdesc("都是纯逗比纯屌丝");
 64         session.save(student);
 65         transaction.commit();
 66         session.close();
 67     }
 68     //3、保存班级的时候同时保存学生
 69     /*
 70      * Hibernate: select max(Sid) from student
 71         Hibernate: select max(Cid) from classes
 72         Hibernate: insert into student (Sname, Sdesc, Sid) values (?, ?, ?)
 73         Hibernate: insert into classes (Cname, Cdesc, Cid) values (?, ?, ?) 
 74      */
 75     @Test
 76     public void testSaveClasses_Students(){
 77         Session session=sessionFactory.openSession();
 78         Transaction transaction= session.beginTransaction();
 79         
 80         Student student=new Student();
 81         student.setSname("屌丝班");
 82         student.setSdesc("都是纯逗比纯屌丝");        
 83         session.save(student);
 84         
 85         Classes classes=new Classes();
 86         classes.setCname("Tom");
 87         classes.setCdesc("1234567890-");
 88         session.save(classes);
 89         
 90         transaction.commit();
 91         session.close();
 92     }
 93     
 94     //4、保存班级的时候同时保存学生,并且建立班级和学生之间的关系
 95     /*classes.hbm.xml中设置;<set name="students" cascade="save-update">
 96      * Hibernate: select max(Cid) from classes
 97         Hibernate: select max(Sid) from student
 98         Hibernate: insert into classes (Cname, Cdesc, Cid) values (?, ?, ?)
 99         Hibernate: insert into student (Sname, Sdesc, Sid) values (?, ?, ?)
100         Hibernate: update student set Cid=? where Sid=?
101         
102         保存班级的时候同时保存学生,并且建立班级和学生之间的关系
103      *         在classes.hbm.xml文件中
104      *         <set name="students" cascade="save-update">
105      *      inverse的值为默认或者false,才能让classes维护student的关系
106         设置<set name="students" cascade="save-update" inverse="true">
107         Hibernate: select max(Cid) from classes
108         Hibernate: select max(Sid) from student
109         Hibernate: insert into classes (Cname, Cdesc, Cid) values (?, ?, ?)
110         Hibernate: insert into student (Sname, Sdesc, Sid) values (?, ?, ?)
111         不建立关联
112      */
113     @Test
114     public void testSaveClasses_R_Students(){
115         Session session=sessionFactory.openSession();
116         Transaction transaction= session.beginTransaction();
117         
118         Student student=new Student();
119         student.setSname("Tom");
120         student.setSdesc("1234567890-");    
121         
122         //session.save(student);必须删除掉
123         
124         Set<Student> students=new HashSet<Student>();
125         students.add(student);
126         
127         Classes classes=new Classes();
128         classes.setCname("屌丝班");
129         classes.setCdesc("都是纯逗比纯屌丝");
130         
131         classes.setStudents(students);
132         
133         session.save(classes);
134         
135         transaction.commit();
136         session.close();
137     }
138     
139     
140     //5、已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系
141     /**
142      *  Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
143         Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
144         Hibernate: select max(Sid) from student
145         Hibernate: insert into student (Sname, Sdesc, Sid) values (?, ?, ?)
146         Hibernate: update student set Cid=? where Sid=?
147      */
148     @Test
149     public void testSaveClassesAndStudents_R(){
150         Session session=sessionFactory.openSession();
151         Transaction transaction=session.beginTransaction();
152         Classes classes=(Classes) session.get(Classes.class, 1L);
153         Student student=new Student();
154         student.setSname("Lucy");
155         student.setSdesc("qwertyuiop");
156         Set<Student> set=new HashSet<Student>();
157         //建立关系
158         classes.getStudents().add(student);
159         
160         //classes.setStudents(set);   把班级中的学生重新更新了
161         
162         transaction.commit();
163         session.close();
164     }
165     //6、已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系
166     /*
167      *  Hibernate: select student0_.Sid as Sid0_0_, student0_.Sname as Sname0_0_, student0_.Sdesc as Sdesc0_0_ from student student0_ where student0_.Sid=?
168         Hibernate: select max(Cid) from classes
169         Hibernate: insert into classes (Cname, Cdesc, Cid) values (?, ?, ?)
170         Hibernate: update student set Cid=? where Sid=?
171      */
172     @Test
173     public void testSaveStudentAndClasses_R(){
174         Session session =sessionFactory.openSession();
175         Transaction transaction= session.beginTransaction();
176         
177         Student student=(Student) session.get(Student.class, 2L);
178         
179         Classes classes=new Classes();
180         classes.setCname("文艺青年班");
181         classes.setCdesc("感觉都是文艺青年棒棒哒");
182         
183         Set<Student> set=new HashSet<Student>();
184         set.add(student);
185         classes.setStudents(set);
186         
187         session.save(classes);
188         
189         transaction.commit();
190         session.close();
191     }
192     
193     //7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
194     /*
195      *  Hibernate: select student0_.Sid as Sid0_0_, student0_.Sname as Sname0_0_, student0_.Sdesc as Sdesc0_0_ from student student0_ where student0_.Sid=?
196         Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
197         Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
198         Hibernate: update student set Cid=? where Sid=?//建立关系
199      * 
200      */
201     @Test
202     public void testSaveRemove_Student_Classes(){
203         Session session=sessionFactory.openSession();
204         Transaction transaction=session.beginTransaction();
205         Student student=(Student) session.get(Student.class, 2L);
206         
207         Classes classes=(Classes) session.get(Classes.class, 1L);
208         classes.getStudents().add(student);//建立关系,没有必要删除与原来班级的关系,建立关系之后,自动解除与原来班级的关系
209         transaction.commit();
210         session.close();
211     }
212     //8、已经存在一个学生,解除该学生和该学生所在班级之间的关系
213     /*
214      *  Hibernate: select student0_.Sid as Sid0_0_, student0_.Sname as Sname0_0_, student0_.Sdesc as Sdesc0_0_ from student student0_ where student0_.Sid=?
215         Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
216         Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
217         Hibernate: update student set Cid=null where Cid=? and Sid=?
218      * 
219      */
220     @Test
221     public void testRemoveStudent(){
222         Session session=sessionFactory.openSession();
223         Transaction transaction =session.beginTransaction();
224         
225         Student student=(Student) session.get(Student.class, 1L);
226         Classes classes=(Classes)session.get(Classes.class, 1L);
227         classes.getStudents().remove(student);
228         transaction.commit();
229         session.close();
230     }
231     
232     //9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
233     /*
234      *  Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
235         Hibernate: select student0_.Sid as Sid0_, student0_.Sname as Sname0_, student0_.Sdesc as Sdesc0_ from student student0_ where student0_.Sid in (3 , 4 , 5)
236         Hibernate: update student set Cid=null where Cid=?
237         Hibernate: update student set Cid=? where Sid=?
238         Hibernate: update student set Cid=? where Sid=?
239         Hibernate: update student set Cid=? where Sid=?
240      * 
241      */
242     @Test
243     public void testRemoveAllAndAddSome(){
244         Session session =sessionFactory.openSession();
245         Transaction transaction=  session.beginTransaction();
246         
247         Classes classes=(Classes) session.get(Classes.class, 1L);
248         List<Student> students= session.createQuery("FROM Student WHERE Sid IN(3,4,5) ").list();
249         
250         Set<Student> sets=new HashSet<Student>(students);        
251         classes.setStudents(sets);
252         
253         transaction.commit();
254         session.close();
255     }
256     
257     //10、解除该班级和所有的学生之间的关系
258     /*
259      *  Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
260         Hibernate: update student set Cid=null where Cid=?
261      */
262     @Test
263     public void testRemoveAll(){
264         Session session=sessionFactory.openSession();
265         Transaction transaction =session.beginTransaction();
266         
267         Classes classes=(Classes) session.get(Classes.class, 1L);
268         classes.setStudents(null);
269         
270         transaction.commit();
271         session.close();
272     }
273     /*
274      * 11、删除班级
275      *      *
276      *          *  解除该班级和所有的学生之间的关系
277      *          *  删除该班级
278      *      *   
279      *          删除班级的同时删除学生
280      * 12、删除学生
281      *      同删除班级
282      * 
283      */
284     //11、删除学生,同删除班级
285     /*
286      *  Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
287         Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
288         Hibernate: update student set Cid=null where Cid=?
289         Hibernate: delete from student where Sid=?
290         Hibernate: delete from student where Sid=?
291         Hibernate: delete from student where Sid=?
292         Hibernate: delete from classes where Cid=?
293      */
294     @Test
295     public void testDeleteClasses(){
296         Session session =sessionFactory.openSession();
297         Transaction transaction=session.beginTransaction();
298         
299         Classes classes=(Classes) session.get(Classes.class, 1L);
300         session.delete(classes);
301         
302         transaction.commit();
303         session.close();
304     }    
305 }
一对多单向关联例子

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。