我有这个非常简单的方法:
public D saveDocument(D document) {
final Session currentSession = getCurrentSession();
System.out.println("Current session contains document: " + currentSession.contains(document));
try {
currentSession.saveOrUpdate(document);
} catch (NonUniqueObjectException e) {
e.printStackTrace();
throw e;
}
return document;
}
这就是第二个语句和stacktrace为我打印的内容:
当前会话包含document:false org.hibernate.NonUniqueObjectException:一个不同的对象 相同的标识符值已与会话关联: [com.innflow.ebtam.model.document.flowexpense.ExpenseDocument#6813]
当我尝试保存id为6813的文档时会发生这种情况。所以Hibernate最初告诉我对象在会话中不是,但是当我尝试调用Session#saveOrUpdate时我就是得到NonUniqueObjectException
。
我在这里失踪的是什么?可能是什么原因?
答案 0 :(得分:1)
最可能的情况是您尝试保存的document
已分离。这就是contains
方法导致错误的原因,即使具有相同id的实体已经在会话中。
一旦持久性提供程序尝试附加并保存实体,它就会检查当前会话中是否已存在具有该id的实体。
在这种情况下,您应该尝试merge
而不是save
:
currentSession.merge(document);