Hibernate---inverse,cascade总结

来源:互联网 发布:mit公开课 矩阵理论 编辑:程序博客网 时间:2024/05/29 11:54

日常项目中,我们用的比较多的是many-to-one模式,因此做了上述的一个总结。

其实那只是hibernate的特性和使用规则,真正项目中要看如何灵活配置和应用。可以从业务需求,代码性能和代码量上考虑。

对于业务需求,比如在一些应用中,我们提供了删除用户和部门的功能但是实际要求是当删除部门时,不能将用户的数据真正删除掉,那么此时就要考虑,在部门那一端,不能设置cascade=delete或者all

 

从性能上考虑,无非是减少session的开启次数以及同数据库的交互次数,对于session开启次数的讨论不在本文,但是为了减少和数据库通信次数,那么就要控制发出的sql语句数。举个例子:

Seal  和 BranchInfo 如果在set中设置inverse=false那么保存或更新branchinfo是将会级联更新与之相关的所有seal记录,但是如果交给seal去维护关系,当保存seal时去更新关系,大家可以做一个测试,此时不会发出更新语句,会发出如下语句,注意红色部分:

Hibernate: insert into tbranchinfo (address, depname, id) values (?, ?, ?)
Hibernate: insert into tseal (sealName, branchInfoId, id) values (?, ?, ?)
Hibernate: insert into tsealmodel (id) values (?)

 

之所以能保存tbrachinfo是因为在many-to-one中设置了cascade=save-update。

 

综上我们建议让many-to-one一端(就是多的一端)去维护关系,级联保存一的一端,同时配合在一的一端设置lazy=true延迟加载集合对象来优化性能。

 

当然对于一级和二级缓存,用的较多的是一级缓存。二级缓存需要根据实际项目来设置。

原创粉丝点击