Здравствуйте У меня есть простой DAO с нижеприведенной функцией.
public element createElement(Element e){
em.persist(e);
em.flush();
return e;
}
Таблица Entity имеет уникальное ограничение на пару (тип,значение) и у меня есть тест ниже:
public void testCreateElement() throws DataAccessException {
// Start with empty Element table
Element e = new Element();
e.setType(myType.OTHER);
e.setValue("1");
dao.createElement(e);
e = new Element();
e.setType(MyType.OTHER);
e.setValue("1");
try{
// this should violate unique constraint of database.
dao.createElement(e);
} catch (Exception ex) {
System.out.println(ex);
}
e.setValue("2");
try{
// I expect this to work as there is no element with these values.
dao.createElement(e);
} catch (Exception ex) {
System.out.println(ex);
}
}
Моя первая пойманная ошибка происходит, как я ожидаю, поскольку я знаю, что я нарушаю ограничение, вторая попытка/ловля не должна бросать ошибку, насколько я понимаю, но она бросает, и я получаю следующее:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mypackage.Element
Похоже, что вызов persist() на "e", хотя он не был сохранен, заставил hibernate думать, что это отделенная сущность.
Это раздражает, потому что эти функции используются фронт-эндом JSF, который работает с исключением ConstraintViolation, но намеренно удерживает объект, чтобы пользователь мог изменить одно из полей и попробовать снова, а он получает ошибку detached entity.
Является ли такое поведение ошибкой hibernate, потому что я не думаю, что он должен делать это на самом деле? Есть ли способ обойти это на уровне DAO, чтобы persist не считал мой объект отсоединенным, если он на самом деле не сохраняется?
С уважением,
Glen x