Hibernate之关系映射OneToMany

ManyToOne单向

Hibernate之关系映射OneToMany_第1张图片
one
Hibernate之关系映射OneToMany_第2张图片
Many
Hibernate之关系映射OneToMany_第3张图片
one的hbm.xml
Hibernate之关系映射OneToMany_第4张图片
many的hbm.xml

测试add:


Hibernate之关系映射OneToMany_第5张图片
先添加为1的一方
Hibernate之关系映射OneToMany_第6张图片
先添加为多的一方


先添加为one的一方,再添加为many的一方,共需要三条sql语句,

先添加为many的一方,再添加为one的一方,共需要五条sql语句,增加了更新语句

所以最佳实践:一定要先添加一的一方,之后再添加多的一方

测试load:

Hibernate之关系映射OneToMany_第7张图片
load

load加载时:关联对象的加载也是延迟的。

测试cascade=all的用处:

Hibernate之关系映射OneToMany_第8张图片
add

没有添加cascade=all的时候:抛出异常。

Hibernate之关系映射OneToMany_第9张图片
cascade

当添加了cascade之后,不会抛出异常。

但是同时cascade也会造成一些问题,在删除的时候:

Hibernate之关系映射OneToMany_第10张图片
delete

上述删除会抛出异常。原因如下:

如果删除的时候,cascade也会把关联的对象删除,但是对于多对一的情况来说,删除一个也会把关联的唯一一个删除,但是又因为还有其他对象在关联,所以删除不掉这个关联对象,导致这个对象也删除不掉,抛出异常,造成灾难。

所以没有特殊情况,不要使用cascade。

一般使用cascade的地方都是一One的地方进行删除时使用,特殊情况才使用cascade的add,正常情况add都是由程序员完成添加的

多Many的地方不建议使用cascade.




OneToMany单向

One:

Hibernate之关系映射OneToMany_第11张图片
one

Many

Many

映射文件:

Hibernate之关系映射OneToMany_第12张图片
One.hbm.xml
Many.HBM.XML

测试add:

Hibernate之关系映射OneToMany_第13张图片
add测试

load测试:

Hibernate之关系映射OneToMany_第14张图片
load

注意:使用lazy="extra"会稍微智能,会根据取值的不同来判断是调用count还是投影

Hibernate之关系映射OneToMany_第15张图片

特别注意oneToMany在添加和维护关系的时候比较麻烦,所以在开发中不建议使用oneToMany的单向。




ManyToOne双向

实体类

Hibernate之关系映射OneToMany_第16张图片
One
Hibernate之关系映射OneToMany_第17张图片
Many

映射文件:

Hibernate之关系映射OneToMany_第18张图片
One.hbm.xml
Hibernate之关系映射OneToMany_第19张图片
Many.hbm.xml

测试add

使用一的一端来维护关系:

Hibernate之关系映射OneToMany_第20张图片
add

结论:此处会生成五条sql语句,所以最佳实践是,先添加一的一方,再添加多的一方,不要使用一的一方来维护关系.

实施方法:在配置文件的set中可以通过设置inverse=true来明确不使用一的这一端来维护关系

Hibernate之关系映射OneToMany_第21张图片
one.hbm.xml

使用inverse=true的时候会生成三条sql语句,因为不会应为cr的增加而去更新student的表。

不去维护关系,自然就少了两条sql语句,但是同时由于在一的一端来添加,又inverse=true,所以会造成关联失败。这就需要程序员自己主动使用多的一方来维护关系。

使用多的一端来维护关系:

Hibernate之关系映射OneToMany_第22张图片
add

测试load:

Hibernate之关系映射OneToMany_第23张图片
load

因为有关联关系的存在都可以取出来数据。



你可能感兴趣的:(Hibernate之关系映射OneToMany)