一尘不染

回滚后,JPA / Hibernate中的实体状态和实体ID值

hibernate

如果我回滚,会话中的实体会怎样?他们会在交易之前回到状态吗?特别是他们会获得新的ID吗?

例:

session.startTransaction();
Entity e = new Entity(); //e.id == null
session.save (e);        //suppose it was ok
session.rollback();      // e.id == ???

更新

我已经进行了Hibernate 4测试。测试后,该实体已成为新的ID。


阅读 244

收藏
2020-06-20

共1个答案

一尘不染

我将简单地引用JPA实现(3.3.2事务回滚):

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

这实际上意味着,这取决于在调用之前是否具有ID
em.rollback()(取决于FlushMode和JPA的实现)。如果分配了ID,则该ID将保持设置状态。如果没有,那么您将没有ID。

2020-06-20