【发布时间】:2017-10-23 20:49:42
【问题描述】:
我正在开发一个连接到 Oracle 10g 数据库的 Hibernate 3.5.6.FINAL 应用程序,我需要防止对特定实体进行脏读。
为此,我使用了 JPA 的标准版本列。它在我们的 Hibernate XML 映射中配置如下:
<version name="lockVersion" column="LOCK_VERSION"/>
但显然我们现在需要对所有相关实体使用版本。
特别是,我们与另一个实体EntityB 存在多对一关系,因为我们不会在这些表上进行插入或更新,所以我们不需要覆盖版本。这种关系映射如下:
<many-to-one name="entityB" column="ENTITY_B" class="com.example.EntityB" lazy="false" update="false" insert="false" cascade="none" />
问题在于,每当我们尝试对原始实体进行更新时,都会出现以下错误:
InvalidDataAccessApiUsage:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:
显然,Hibernate 认为EntityB 的实例是瞬态的,因为它没有Version(因此,Version = null);但它不包含 Version 字段,因为它是未版本化的,而不是因为它是瞬态的。实际上,该实例是从数据库中获取的,并且它有一个主键。
有什么方法可以配置 Hibernate,使其不检查相关对象是否已版本化?
请注意:我尝试使用 Hibernate 非版本机制实现 Optimistic Lock,但我们的应用程序使用分离模式;所以这种方法对我们来说是不可行的。
【问题讨论】: