在我正在处理的应用程序中,我有一个senario,
UI更新一些已经从数据库中恢复的数据并将对象发送回服务器(比如使用EntityTag.java),Server再次从数据库中恢复该对象(比如在休眠中映射文件的Entity.java)并将EntityTag中的所有值复制到Entity.java对象中。
现在,使用某些服务,它会尝试保存更新的Entity.java对象。这是在春季声明性交易中做的。所以,我假设新的交易是在这项服务上启动的。
我希望在此服务方法中看到的是一个会话。 merge()因为,我们更新了一个被分离的对象,但是在这里他们在entity.java对象上使用了saveOrUpdate。我看到对象已更新到表中而没有任何问题。这是如此奇怪,直到现在我一直在想合并会将对象合并到会话中,之后,我可以提交更改,这对我来说似乎很苛刻。
在什么情况下saveandupdate可以正常工作?
答案 0 :(得分:1)
如果不存在与调用saveOrUpdate
的会话相关联的相同数据库标识符的对象,则answer,saveOrUpdate
可以正常工作。
如果一个对象已经存在且具有相同的数据库Id,则saveOrUpdate会抛出错误,而merge将只是用新对象替换会话中的对象,并返回对新附加对象的引用。
Hibernate有一个名为saveOrUpdateCopy的方法,提供与当前merge
相同的方法,
在JPA中合并为标准化。
尽管saveOrUpdate
仍然可用并在许多教程中使用,但在处理分离对象时总是使用merge
会更好,因为它很难/容易错误地猜测对象是否是已经在一个会话中。