嗨,我有一个简单的 DAO,具有以下功能。
public element createElement(Element e){
em.persist(e);
em.flush();
return e;
}
实体表对 (type,value) 对具有唯一约束,我在下面进行了测试:
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);
}
}
我的第一个捕获的错误发生在我的预期中,因为我知道我违反了约束,就我而言,第二个 try/catch 不应该抛出错误,但确实如此,我得到的是:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mypackage.Element
所以似乎在“e”上调用persist(),即使它没有被持久化已经导致hibernate认为它是一个分离的实体。
这很烦人,因为处理 ConstraintViolation 异常的 JSF 前端正在使用这些函数,但故意保留对象以便用户可以更改其中一个字段并重试,但他们得到了分离实体错误.
这种行为是否是休眠错误,因为我认为它真的不应该这样做?在 DAO 级别有没有办法解决这个问题,这样持久化就不会;如果我的对象实际上没有持久化,就不会将它视为分离的吗?
问候,
格伦 x