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

时间:2013-02-25 09:57:30

标签: database spring hibernate orm hibernate-mapping


我试图删除数据库中不存在的实体,但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()何时可以抛出异常。

1 个答案:

答案 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);
    }
}