我正在使用Hibernate 4并正在实施我的DAO和服务。我似乎可以单独实现saveOrUpdate()
而不是实现save()
和update()
,这将要求服务检查是否应调用save()
或update()
。
1)Hibernate在saveOrUpdate()
中的未保存值检查是否已经足够优化,可以随时调用它,还是应该自己进行检查?
2)如果保存或更新的决定取决于密钥以外的字段,saveOrUpdate()
是否无法使用?
答案 0 :(得分:1)
1)见这里:Hibernate automatic state detection它说
saveOrUpdate()执行以下操作:
- 如果该对象在此会话中已经持久,则不执行任何操作
- 如果与会话关联的另一个对象具有相同的标识符,则抛出异常
- 如果对象没有标识符属性,则保存()它
- 如果对象的标识符具有分配给新实例化对象的值,则保存()它
- 如果对象由or版本化,并且version属性值是分配给新实例化对象的相同值,则save()它
- 另外更新()对象
因此,在某些情况下,会执行偶尔的Select以查看对象是否已存在(例如,如果ID不是某个自动生成的值)。因此,如果您手动执行此操作或者如果您让hibernate执行此操作对我没有任何影响,如果有任何我会说使用saveOrUpdate具有更好的性能,因为首先执行更多检查以超出更新规则,这可以节省一些插入的时间和其次,当你自己进行检查时,你必须在检查时通过完全休眠选择更多层。 另外:自己做检查会对代码可维护性产生影响。例如,如果添加二级缓存,则可能需要优化保存和选择。或者如果您应用其他一些调整,您可能会需要在更多地方更改代码。
2)saveOrUpdate仅考虑条目标识符。所以是的,除了密钥之外的其他字段无法使用。
答案 1 :(得分:0)
saveOrUpdate()
检查实体是否已拥有ID。如果是,则调用update()
,否则调用save()
方法。