1

我不确定这是否正确,但我需要在事务回滚后,我的对象返回其初始状态。我创建了一个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());

我是否错误地假设对象必须返回其初始状态?

谢谢。

4

1 回答 1

3

我是否错误地假设对象必须返回其初始状态?

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

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

事务回滚

对于事务范围和扩展的持久性上下文,事务回滚会导致所有预先存在的托管实例和已删除的实例 [31] 分离。实例的状态将是事务回滚时实例的状态。事务回滚通常会导致持久性上下文在回滚时处于不一致的状态。特别地,版本属性的状态和生成的状态(例如,生成的主键)可能不一致。因此,以前由持久性上下文管理的实例(包括在该事务中持久化的新实例)可能无法以与其他分离对象相同的方式重用——例如,它们在传递给合并操作时可能会失败。[32]

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

于 2013-05-23T13:39:27.327 回答