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