最好的方法是:
我有一些实体存储为Hibernate实体,它们包含一些需要对于单行唯一的字段。因此,当我创建另一个具有等于已经持久化的字段集的实体时,我想用new覆盖旧记录,否则创建新记录。
实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
如果这是您实体的主键,则可以使用session.merge(entity)
或session.saveOrUpdate(entity)
如果它是另一个唯一约束,则必须手动处理 - 首先尝试查找具有该值的实体(带有查询),如果它不存在,则保存新的,否则,全部转移字段(主键除外)
答案 1 :(得分:0)
使用.merge()代替。
来自http://www.stevideter.com/2008/12/07/saveorupdate-versus-merge-in-hibernate/:
理论:如果我们然后修改我们的分离对象并想要更新它,我们必须重新附加该对象。在重新附加过程中,Hibernate将检查是否存在同一对象的任何其他副本。如果它找到了,它必须告诉我们它不知道“真正的”副本是什么了。也许对我们希望保存的其他副本进行了其他更改,但Hibernate不了解它们,因为它当时没有管理它们。
Hibernate不是保存可能不好的数据,而是通过NonUniqueObjectException告诉我们这个问题。