gpt4 book ai didi

database - org.hibernate.Session 什么时候抛出 HibernateException?

转载 作者:搜寻专家 更新时间:2023-10-30 20:42:08 28 4
gpt4 key购买 nike


我试图删除数据库中不存在的实体,但 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;
}
}

编辑:
我使用以下代码在测试中调用删除:

final MyEntity instance2 = new MyEntity (Utilities.maxid + 1); //non existent id
try {
mydao.remove(instance2);
sessionFactory.getCurrentSession().flush();
fail(removeFailed);
} catch (final RuntimeException ex) {

}

即使我调用刷新测试也不会失败,为什么?
我想得到一个异常(exception)。无论如何,我也有兴趣了解 delete() 何时可以抛出异常。

最佳答案

我认为您发现的问题与您尝试删除的对象的状态有关。 hibernate 使用了 3 种主要状态:transient、persistent 和 detached。

transient 实例是一个从未被持久化的全新实例。一旦你坚持了,它就变得执着了。在连接关闭并且对象被持久化之后,它被分离。文档更详细地解释了 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 的全新实例,您的实例是暂时的(从未持久化)。我认为当您为 transient 实例调用 delete 时,hibernate 会忽略。 Delete 表示它从数据存储中删除了一个持久实例。 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);
}
}

关于database - org.hibernate.Session 什么时候抛出 HibernateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15064296/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com