我正在使用Hibernate 4,并正在实现我的DAO和服务。似乎我可以只实现saveOrUpdate()
而不是分别实现save()
和update()
,这将要求服务检查是否应调用save()
或update()
。
1)Hibernate在saveOrUpdate()
中的未保存值检查是否已优化到足以始终调用它还是我应该自己进行检查?
2)如果保存或更新的决定取决于键以外的其他字段,saveOrUpdate()
不可用吗?
最佳答案
1)参见此处:Hibernate automatic state detection它说
saveOrUpdate()执行以下操作:
-如果对象在此会话中已经存在,则不执行任何操作
-如果与会话关联的另一个对象具有相同的标识符,则引发异常
-如果对象没有标识符属性,请保存()
-如果对象的标识符具有分配给新实例化的对象的值,则将其保存()
-如果该对象使用或进行版本控制,并且version属性值与分配给新实例化的对象的值相同,则将其save()
-否则,update()对象
因此,在某些情况下,偶尔会执行Select来查看对象是否已经存在(例如,如果ID不是某个自动生成的值)。因此,如果您手动执行此操作或让它进行休眠操作,对我来说都没有影响,如果我说使用saveOrUpdate具有更好的性能,因为首先执行更多检查以排除更新,这样可以节省一些插入和删除操作的时间。其次,当您自己进行检查时,必须在检查时经过完全休眠选择的更多层。
另外:自己进行检查将对代码的可维护性产生影响。例如,如果添加二级缓存,则可能需要优化保存并选择。或者,如果您进行其他一些调整,则可能需要在更多地方更改代码。
2)saveOrUpdate仅考虑条目标识符。因此,是的,对于键以外的其他字段将无法使用。