如果使用clear,则在Hibernate异常后需要回滚

时间:2013-04-29 01:40:34

标签: java hibernate exception rollback

如果我在调用commit期间遇到Hibernate异常。在catch块中,如果使用clear,则需要回滚吗?

e.g。

EntityTransaction t = em.getTransaction();
t.begin();
try {
    ...
    t.commit();
} catch (StaleObjectStateException ex) {
    ... // rollback needed?
} finally {
    t.clear();
}

而不是

EntityTransaction t = em.getTransaction();
t.begin();
try {
    ...
    t.commit();
} catch (StaleObjectStateException ex) {
    if (t.isActive()) {
        t.rollback();
    }
}

有什么区别,你如何决定使用哪个?

谢谢

1 个答案:

答案 0 :(得分:6)

当发生hibernate异常时,Hibernate本身会在该会话中进行回滚。这意味着在catch语句中不需要t.rollback()

事件更多,当发生hibernate异常时,会话实例被破坏,不能再使用了。如果继续使用此实例,那么您将获得StaleStateException。您必须创建一个新的会话实例,而不是clear()。