如果我回滚,会话中的实体会怎样?他们会在交易之前回到状态吗?特别是他们会获得新的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]
这实际上意味着,这取决于在调用em.rollback()
之前是否具有ID(取决于FlushMode和JPA的实现)。如果分配了ID,则该ID将保持设置状态。如果没有,那么您将没有ID。