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 }

hibernate建表一对多,布布扣,bubuko.com

时间: 2024-12-24 02:27:45

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

hibernate 建表一对一 就是一对多,多的一方外键唯一unique

Person.java 1 package cn.itcast.hiberate.sh.domain.onetoone; 2 3 import java.io.Serializable; 4 import java.util.Set; 5 6 public class Person implements Serializable{ 7 private Long cid; 8 private String cname; 9 private String description; 10 11 pub

hibernate建表多对多建表

Student.java 1 package cn.itcast.hiberate.sh.domain; 2 3 import java.util.Set; 4 5 public class Student { 6 private Long sid; 7 private String sname; 8 private String description; 9 Set<Course> courses; 10 11 12 public Set<Course> getCourses()

(原创)hibernate 一对多建表实例详解 附上各个注释的含义

这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的name属性=多的那一端(N端)属性是一的那一端的属性名,mappedBy是定义在Department类中,即Department类不负责维护级联关系.即维护者是Employee类 Department类: package com.javabean; import java.io.Serializa

借助hibernate自动建表

? Hibernate的ORM关系映射底层框架,为我们的开发提供了很多便利,可以说是一个非常棒的J2EE框架,我这里也不 切入主题,逆向思维,借助hibernate实现快速开发.前提,打算在项目里使用hibernate框架开发底层.仅此而已. 一般情况下,开始一个项目,首先是系统的分析需求,然后就是设计数据库,然后找个数据库客户端开始建表,建字段这是个 漫长的过程,然后开工.如果使用hibernate框架(我当然非常推荐使用),jdbc有点麻烦,很多重复的体力活,也不易维护 拓展.当然我也不否定

在应用hibernate框架操作数据库时,是先建表还是先建类?

先建表 可以用myeclipse反转生成类 还可以生成映射文件(更加方便) 先建类 可以设置hibernate属性动态生成表 但映射文件要自己选 在做项目时,首先都会进行数据分析,会形成数据字典.当数据字典出来以后,我们可以根据数据字典写sql语句建表,也可以根据这份数据字典写实体类或实体类映射文件,然后再生成数据表.通过表生产实体类这一过程叫做反向工程.不过现在公司开发采用反向工程的比较多,因为数据表通常都会在编码前设计好,相对较稳定,这样有利于程序员编码等后期工作.

Hibernate不能自动建表解决办法【转载】

  最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且在mysql中新建了一个hibernate数据库,仅此而已.然而预想不到的事情发生了--程序写好之后,运行,报错        Hibernate: insert into news_table (title, content) values (?, ?)        Exception in thre

[转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言

最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且在mysql中新建了一个hibernate数据库,仅此而已.然而预想不到的事情发生了……程序写好之后,运行,报错Hibernate: insert into news_table (title, content) values (?, ?) Exception in thread "main&quo

Spring整合Hibernate中自动建表

Spring整合Hibernate中自动建表 博客分类: JavaEE Java代码   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> <