【发布时间】:2018-01-29 22:18:21
【问题描述】:
假设一个分离的实体 foo,它的版本是 10。另一个用户改变了 Foo,它的版本在数据库中变成了 11。
em.merge(foo)
一些 JPA 提供程序(例如 Hibernate)将从持久性加载实体并将分离的 foo 的更改复制到实体(托管)。加载相同版本或最新版本的实体?在合并时或刷新时抛出乐观锁异常?
【问题讨论】:
假设一个分离的实体 foo,它的版本是 10。另一个用户改变了 Foo,它的版本在数据库中变成了 11。
em.merge(foo)
一些 JPA 提供程序(例如 Hibernate)将从持久性加载实体并将分离的 foo 的更改复制到实体(托管)。加载相同版本或最新版本的实体?在合并时或刷新时抛出乐观锁异常?
【问题讨论】:
...要将分离的实体关联到活动的 Hibernate Session,您可以选择以下选项之一:
重新附加 Hibernate(但不是 JPA 2.1)支持通过重新附加 Session#update 方法。
Hibernate Session 只能关联一个给定的实体对象 数据库行。这是因为持久性上下文充当 内存缓存(一级缓存),只有一个值(实体) 关联到给定的键(实体类型和数据库标识符)。
只有在没有其他 JVM 对象时才能重新附加实体 (匹配相同的数据库行)已经关联到当前 休眠会话。
即使在合并操作之后,分离的对象实例也将继续保持分离状态。
因此,如果您处于第二种情况,并且 Session 没有相关的托管实体,则会触发调用以检索全新的实体。由于读取不是事务性的,因此您无法锁定任何内容。
【讨论】: