SSHM四大框架

Hibernate之关系映射OneToMany

2016-08-18  本文已影响778人  昵称已被占用了啊

ManyToOne单向

one Many one的hbm.xml
many的hbm.xml

测试add:


先添加为1的一方
先添加为多的一方


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

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

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

测试load:

load

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

测试cascade=all的用处:

add

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

cascade

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

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

delete

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

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

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

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

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




OneToMany单向

One:

one

Many

Many

映射文件:

One.hbm.xml
Many.HBM.XML

测试add:

add测试

load测试:

load

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

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




ManyToOne双向

实体类

One
Many

映射文件:

One.hbm.xml
Many.hbm.xml

测试add

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

add

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

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

one.hbm.xml

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

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

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

add

测试load:

load

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


上一篇下一篇

猜你喜欢

热点阅读