Hibernate之关系映射OneToMany
ManyToOne单向
one Many one的hbm.xmlmany的hbm.xml
测试add:
先添加为1的一方
先添加为多的一方
先添加为one的一方,再添加为many的一方,共需要三条sql语句,
先添加为many的一方,再添加为one的一方,共需要五条sql语句,增加了更新语句
所以最佳实践:一定要先添加一的一方,之后再添加多的一方
测试load:
loadload加载时:关联对象的加载也是延迟的。
测试cascade=all的用处:
add没有添加cascade=all的时候:抛出异常。
cascade当添加了cascade之后,不会抛出异常。
但是同时cascade也会造成一些问题,在删除的时候:
delete上述删除会抛出异常。原因如下:
如果删除的时候,cascade也会把关联的对象删除,但是对于多对一的情况来说,删除一个也会把关联的唯一一个删除,但是又因为还有其他对象在关联,所以删除不掉这个关联对象,导致这个对象也删除不掉,抛出异常,造成灾难。
所以没有特殊情况,不要使用cascade。
一般使用cascade的地方都是一One的地方进行删除时使用,特殊情况才使用cascade的add,正常情况add都是由程序员完成添加的
多Many的地方不建议使用cascade.
OneToMany单向
One:
oneMany
Many映射文件:
One.hbm.xmlMany.HBM.XML
测试add:
add测试load测试:
load
注意:使用lazy="extra"会稍微智能,会根据取值的不同来判断是调用count还是投影
特别注意oneToMany在添加和维护关系的时候比较麻烦,所以在开发中不建议使用oneToMany的单向。
ManyToOne双向
实体类
OneMany
映射文件:
One.hbm.xmlMany.hbm.xml
测试add
使用一的一端来维护关系:
add结论:此处会生成五条sql语句,所以最佳实践是,先添加一的一方,再添加多的一方,不要使用一的一方来维护关系.
实施方法:在配置文件的set中可以通过设置inverse=true来明确不使用一的这一端来维护关系
one.hbm.xml使用inverse=true的时候会生成三条sql语句,因为不会应为cr的增加而去更新student的表。
不去维护关系,自然就少了两条sql语句,但是同时由于在一的一端来添加,又inverse=true,所以会造成关联失败。这就需要程序员自己主动使用多的一方来维护关系。
使用多的一端来维护关系:
add测试load:
load因为有关联关系的存在都可以取出来数据。