我不确定这是否正确,但我需要在事务被回滚后,我的对象返回其初始状态。我创建了一个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());
假设对象必须返回它的初始状态我错了吗?
感谢。
答案 0 :(得分:3)
假设对象必须返回它的初始状态我错了吗?
Hibernate不会回滚对象状态。最好永远不要在事务中重用对象,这样就不会出现这样的问题。
从this answer引用spec(重点是我的):
交易回滚
对于事务范围和扩展持久性上下文, 事务回滚导致所有预先存在的托管实例和 删除了实例[31]以使其脱离。实例的状态会 是事务处的实例的状态 被退了回去。事务回滚通常会导致持久性 回滚时上下文处于不一致状态。在 特别是,版本属性和生成状态的状态(例如, 生成的主键可能不一致。那些实例 以前由持久化上下文管理(包括新实例) 因此,在该交易中坚持不懈)可能不是 可以像其他分离对象一样重复使用 - 例如, 它们可能在传递给合并操作时失败。 [32]
这就是为什么我认为最好不要在事务中重复使用:虽然只要事务成功完成就可以工作,如果事务失败,事情会变得更复杂。通常,无论如何都没有令人信服的理由在交易中重复使用entites。