0

我阅读了很多有关此异常的信息,但这对我来说非常困难。

你能写出最简单的例子,其中会有这个例外吗?

4

2 回答 2

0

发生这种情况是因为 hibernate 使用会话作为其一级缓存,如果我们已经将该对象处于分离状态,并且我们再次尝试在具有相应 id 的另一个会话中获取该对象并想要更新相同的对象,我们将得到此异常。

最好使用 merge() 方法而不是更新。

    Session session = sessionFactory.openSession();
    Transaction transaction1 = session.beginTransaction();
    Person person = new Person();
    person.setName("NAME");
    person.setId(1);//primary key column.
    session.save(person);//making person object persistent.
    transaction1.commit();
    person.setName("some another name");//modifying detached object 

    Session session2 = sessionFactory.openSession();
    Transaction transaction2 = session2.beginTransaction();
    Person updatedPerson=(Person)session2.get(Person.class,1);//now same object with persistent state attached to session2.
     //session.update(person);//will throw exception because update will try to reattach person object to session2 and already one persistent object with same identifier  updatedPerson object existed in session2 so it will throw this exception.

     session2.merge(person);//it will execute fine.
     transation2.commit();
     session2.close();
于 2013-09-13T09:39:28.110 回答
0

当您尝试使用以下方法更新实体时会发生这种情况:

session.saveOrUpdate(entity);

这是因为您尝试更新的实体与数据库中的实体具有相同的 ID 或 PK,实际上它更喜欢使用 merge 而不是 saveOrUpdate :

session.merge(entity);

这是此异常的完整示例:

        Person person = new Person();
        person.setName("NAME");

        Session session = sessionFactory.openSession();
        Transaction transaction1 = session.beginTransaction();
        session.persist(person);
        transaction1.commit();
        session.close();

        person.setName("NEW NAME");

        session = sessionFactory.openSession();
        Transaction transaction2 = session.beginTransaction();
        try {

            // Here the exception will be thrown.
            session.saveOrUpdate(person);

            transaction2.commit();
        } catch (NonUniqueObjectException ex) {
            ex.printStackTrace();
        }
        session.close();
于 2013-09-09T16:19:43.420 回答