我试图删除数据库中不存在的实体,但delete()方法不会抛出任何异常。
当我尝试删除不存在的实体时,如何收到错误?
我复制了以下代码:
public void remove(MyEntity persistentInstance) {
logger.debug("removing entity: " + persistentInstance);
try {
sessionFactory.getCurrentSession().delete(persistentInstance);
logger.debug("remove successful");
} catch (final RuntimeException re) {
logger.error("remove failed", re);
throw re;
}
}
编辑:
我使用以下代码在测试中调用remove:
final MyEntity instance2 = new MyEntity (Utilities.maxid + 1); //non existent id
try {
mydao.remove(instance2);
sessionFactory.getCurrentSession().flush();
fail(removeFailed);
} catch (final RuntimeException ex) {
}
即使我打电话给同花顺,测试也不会失败,为什么?我想得到一个例外。无论如何,我也有兴趣了解delete()何时可以抛出异常。
答案 0 :(得分:1)
我认为您发现的问题与您要删除的对象的状态有关。 hibernate使用了3种主要状态:transient,persistent和detached。
瞬态实例是一个从未持久存在的全新实例。一旦你坚持下去,它就会变得持久。关闭连接并且对象已被持久化后,它将被分离。文档更详细地解释https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/objectstate.html#objectstate-overview
以下是一个例子:
MyEntity foo = new MyEntity(); // foo is a transient instance
sessionFactory.getCurrentSession.persist(foo); // foo is now a persisted instance
txn.commit(); // foo is now a detatched instance
在您的示例中,您正在创建一个具有未使用ID的全新实例,您的实例是瞬态的(从未被持久化)。我认为当你为一个瞬态实例调用delete时,hibernate会忽略它。删除表示它从数据存储中删除了持久性实例。 https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#delete(java.lang.Object)
相反,尝试这样的事情:
public void remove(long entityId) {
MyEntity myEntity = myEntityDAO.findById(entityId);
if (myEntity == null) {
// error logic here
} else {
sessionFactory.getCurrentSession().delete(myEntity);
}
}