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
...
// здесь мы хотим сохранить 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);
if (p2 == null) {
p2 = new Person();
p2.setId(1);
}
p2.setName("Alex");
hibernateTemplate.saveOrUpdate(p2);

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