Hibernate安全,总是使用SaveOrUpdate?

时间:2014-02-04 16:07:51

标签: java hibernate dao

我正在使用Hibernate 4并正在实施我的DAO和服务。我似乎可以单独实现saveOrUpdate()而不是实现save()update(),这将要求服务检查是否应调用save()update()

1)Hibernate在saveOrUpdate()中的未保存值检查是否已经足够优化,可以随时调用它,还是应该自己进行检查?

2)如果保存或更新的决定取决于密钥以外的字段,saveOrUpdate()是否无法使用?

2 个答案:

答案 0 :(得分:1)

1)见这里:Hibernate automatic state detection它说

  

saveOrUpdate()执行以下操作:

     

- 如果该对象在此会话中已经持久,则不执行任何操作

     

- 如果与会话关联的另一个对象具有相同的标识符,则抛出异常

     

- 如果对象没有标识符属性,则保存()它

     

- 如果对象的标识符具有分配给新实例化对象的值,则保存()它

     

- 如果对象由or版本化,并且version属性值是分配给新实例化对象的相同值,则save()它

     

- 另外更新()对象

因此,在某些情况下,会执行偶尔的Select以查看对象是否已存在(例如,如果ID不是某个自动生成的值)。因此,如果您手动执行此操作或者如果您让hibernate执行此操作对我没有任何影响,如果有任何我会说使用saveOrUpdate具有更好的性能,因为首先执行更多检查以超出更新规则,这可以节省一些插入的时间和其次,当你自己进行检查时,你必须在检查时通过完全休眠选择更多层。 另外:自己做检查会对代码可维护性产生影响。例如,如果添加二级缓存,则可能需要优化保存和选择。或者如果您应用其他一些调整,您可能会需要在更多地方更改代码。

2)saveOrUpdate仅考虑条目标识符。所以是的,除了密钥之外的其他字段无法使用。

答案 1 :(得分:0)

saveOrUpdate()检查实体是否已拥有ID。如果是,则调用update(),否则调用save()方法。