【问题标题】:org.hibernate.NonUniqueObjectExceptionorg.hibernate.NonUniqueObjectException
【发布时间】:2011-09-25 00:05:00
【问题描述】:

我想从数据库中删除一个对象时出错。错误是:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.cartif.database.ApplicationField#asd]

我要删除一个对象:

public static void delete(Object o){
    if(session == null) createSession();
    Transaction tx = session.beginTransaction();
    tx.begin();
    session.delete(o);
    tx.commit();
}

当我用一个对象调用这个方法时,我得到了错误。如果我调试应用程序,则会在 tx.begin(); 中引发异常;行。

在数据库中,这个对象是唯一的,正如我在列中显示的那样:

         name                   deviceid
         "asd"                     1
"ElectricalConsumption"            1
       "Energy"                    1

为什么会这样?

提前致谢!

【问题讨论】:

    标签: hibernate postgresql jakarta-ee


    【解决方案1】:

    此错误表明您在同一个会话中多次加载了相同的对象(这里相同意味着两个对象具有相同的标识符值)。它与数据库中的唯一性没有任何关系。

    【讨论】:

      【解决方案2】:

      NonUniqueObjectException 如果已经与会话关联的对象与您尝试与会话关联的对象具有相同的 id(主键)。

      这通常与 delete method 本身无关,而与 调用 delete 的上下文有关

      检查调用删除的地方。在调用删除的地方检查任何可能的重复对象。

      This question 也可能有帮助。

      【讨论】:

      • 但是我该如何解决这个问题呢?我试过 session.close(), session = null;并创建一个新会话 session.clear(),但它不起作用。
      • 怎么做取决于你的情况。如果您有一个对象(例如来自 UI 层)并通过 PK 对其进行查找,然后尝试删除它,那么您可以直接在其上调用 delete。您可能还想尝试session.flush()。您可以尝试合并两个对象(如果您已识别它们,即)。解决方案完全取决于上下文。
      猜你喜欢
      • 1970-01-01
      • 2017-06-13
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多