Hibernate: Ошибка при сохранении объекта NonUniqueObjectException

NonUniqueObjectException: a different object with the same identifier value was already associated with the session

Данная ошибка проявляется в момент вызова saveOrUpdate() у hibernate template. Суть проблемы в том, что в один момент времени у нас есть два разных объекта с одинаковым идентификатором: один в сессии, а второй тот, что мы пытаемся сохранить.

Person p1 = (Person)getHibernateTemplate().get(Person.class, 1);

...

// здесь мы хотим сохранить Person с именем Alex
// и id = 1 (при том, что у нас уже есть объект p1 в сессии)
Person p2 = new Person();
p2.setId(1);
p2.setName("Alex");

hibernateTemplate.saveOrUpdate(p2); // NonUniqueObjectException

В данном коде разные объекты p1 и p2 имеют одинаковый идентификатор, соответственно, на этапе сохранения мы получим NonUniqueObjectException.

Ошибку можно избежать используя merge() вместо saveOrUpdate() (см. пример выше), либо получив p2, а не создавая новый объект:

Person p2 = (Person)getHibernateTemplate().get(Person.class, 1);
if (p2 == null) {
    p2 = new Person();
    p2.setId(1);
}
p2.setName("Alex");
hibernateTemplate.saveOrUpdate(p2);

Отправить комментарий

Image CAPTCHA
Enter the characters shown in the image.