NonUniqueObjectException其中会话不包含对象本身?

时间:2017-09-26 12:02:41

标签: java hibernate jpa orm

我有这个非常简单的方法:

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

我在这里失踪的是什么?可能是什么原因?

1 个答案:

答案 0 :(得分:1)

最可能的情况是您尝试保存的document已分离。这就是contains方法导致错误的原因,即使具有相同id的实体已经在会话中。

一旦持久性提供程序尝试附加并保存实体,它就会检查当前会话中是否已存在具有该id的实体。

在这种情况下,您应该尝试merge而不是save

currentSession.merge(document);