在Hibernate 6.0中,saveOrUpdate(entity)方法现在已被弃用。Javadoc建议将其替换为merge()或persist()。但是这样做会破坏我的一些测试,例如“具有相同标识符值的不同对象已经与会话关联”(合并)或“唯一索引或主键冲突”(持久化)。如何正确替换我的saveOrUpdate()呼叫?
saveOrUpdate(entity)
merge()
persist()
saveOrUpdate()
lstz6jyr1#
但是这样做会破坏我的一些测试,“具有相同标识符值的不同对象已经与会话关联”(合并)这至少有些出乎意料,因为merge()中通常不会出现这个错误。但是你需要发布(简化的)代码和最重要的是一个堆栈跟踪才能希望我们能够帮助你解决这个问题。或“唯一索引或主键违规”(持续存在)。听起来很正常如何正确替换我的saveOrUpdate()呼叫?通常,您会将其替换为对merge()的调用。但请注意,merge()具有不同的语义,因此它肯定不是一个简单的替代品。
mbyulnm02#
我已经想通了(谢谢你的提示,Mar-Z!).
if (Objects.isNull(session.find(MyEntity.class, entity.getId()))) { session.persist(entity); } else { session.merge(entity); }
首先,从数据库中按ID加载实体,并检查是否返回了该实体。如果没有返回任何内容,persist()会将其作为一个新的实体插入数据库,否则merge()会更新现有的条目。
2条答案
按热度按时间lstz6jyr1#
但是这样做会破坏我的一些测试,“具有相同标识符值的不同对象已经与会话关联”(合并)
这至少有些出乎意料,因为
merge()
中通常不会出现这个错误。但是你需要发布(简化的)代码和最重要的是一个堆栈跟踪才能希望我们能够帮助你解决这个问题。
或“唯一索引或主键违规”(持续存在)。
听起来很正常
如何正确替换我的
saveOrUpdate()
呼叫?通常,您会将其替换为对
merge()
的调用。但请注意,merge()
具有不同的语义,因此它肯定不是一个简单的替代品。mbyulnm02#
我已经想通了(谢谢你的提示,Mar-Z!).
首先,从数据库中按ID加载实体,并检查是否返回了该实体。如果没有返回任何内容,
persist()
会将其作为一个新的实体插入数据库,否则merge()
会更新现有的条目。