如果我回滚,会话中的实体会怎样?他们会在交易之前回到状态吗?特别是他们会获得新的ID吗?
例:
session.startTransaction(); Entity e = new Entity(); //e.id == null session.save (e); //suppose it was ok session.rollback(); // e.id == ???
更新 :
我已经进行了Hibernate 4测试。测试后,该实体已成为新的ID。
我将简单地引用JPA实现(3.3.2事务回滚):
对于事务范围和扩展的持久性上下文,事务回滚都会导致所有先前存在的托管实例和已删除实例[31]分离。实例的状态将是事务回滚时的实例状态。事务回滚通常会导致持久性上下文在回滚时处于不一致状态。特别地,版本属性的状态和所生成的状态(例如,所生成的主键)可能不一致。因此,以前由持久性上下文管理的实例(包括在该事务中成为持久性的新实例)可能无法以与其他分离对象相同的方式重用- 例如,它们在传递给合并操作时可能会失败。[32 ]
这实际上意味着,这取决于在调用之前是否具有ID em.rollback()(取决于FlushMode和JPA的实现)。如果分配了ID,则该ID将保持设置状态。如果没有,那么您将没有ID。
em.rollback()