如何才能使事务回滚和对象的初始状态退出

时间:2013-05-23 12:57:06

标签: java hibernate jpa transactions rollback

我不确定这是否正确,但我需要在事务被回滚后,我的对象返回其初始状态。我创建了一个junit测试,它失败了。

try {
    entityManager.getTransaction().begin();
    entityManager.persist(itemBec);
    //            throw new Exception("teste");
    //            throw new EJBTransactionRolledbackException("teste");
    //            throw new ConstraintViolationException("teste", null, null);
    throw new RuntimeException("teste");
} catch (Exception e) {
    entityManager.getTransaction().rollback();
} finally {
    if (entityManager.getTransaction().isActive()) {
        entityManager.getTransaction().commit();
    }
}
entityManager.close();
factory.close();
Assert.assertNull(itemBec.getId());

假设对象必须返回它的初始状态我错了吗?

感谢。

1 个答案:

答案 0 :(得分:3)

  

假设对象必须返回它的初始状态我错了吗?

Hibernate不会回滚对象状态。最好永远不要在事务中重用对象,这样就不会出现这样的问题。

this answer引用spec(重点是我的):

  

交易回滚

     

对于事务范围和扩展持久性上下文,   事务回滚导致所有预先存在的托管实例和   删除了实例[31]以使其脱离。实例的状态会   是事务处的实例的状态   被退了回去。事务回滚通常会导致持久性   回滚时上下文处于不一致状态。在   特别是,版本属性和生成状态的状态(例如,   生成的主键可能不一致。那些实例   以前由持久化上下文管理(包括新实例)   因此,在该交易中坚持不懈)可能不是   可以像其他分离对象一样重复使用 - 例如,   它们可能在传递给合并操作时失败。 [32]

这就是为什么我认为最好不要在事务中重复使用:虽然只要事务成功完成就可以工作,如果事务失败,事情会变得更复杂。通常,无论如何都没有令人信服的理由在交易中重复使用entites。