【发布时间】:2015-09-11 18:26:07
【问题描述】:
我们有一个奇怪的休眠问题,我们无法解释。
我们有什么:
- 一个抽象类和它的两个子类。我们称它们为 A、SubA1、SubA2
- 我们还有另一个抽象类和一些子类。让我们呼叫 B、SubB1、SubB2。
- SubB1 和 A 之间存在多对一关系。
-
类 A 和 B 的休眠映射如下所示:
<hibernate-mapping> <class name="A" table="A" lazy="false"> <id name="id" column="ID" type="java.lang.Integer"> <generator class="org.hibernate.id.enhanced.TableGenerator"> <param name="segment_value">a</param> </generator> </id> <version name="olVersion" column="VERSION" type="integer" unsaved-value="negative" /> <joined-subclass name="SubA1" table="SUB_A1" lazy="false"> <key column="ID_A" foreign-key="FK_SUB_A1_A"/> <property name="p1" column="p1" length="255" unique="true"/> <property name="p2" column="p2" length="255" not-null="true" /> </joined-subclass> <joined-subclass name="SubA2" table="SUB_A2" lazy="false"> <key column="ID_A" foreign-key="FK_SUB_A2_A"/> <property name="p3" column="p3" length="255" not-null="true" unique="true" /> <property name="p4" column="p4" length="4000" /> </joined-subclass> </class> </hibernate-mapping>
和
<hibernate-mapping>
<class name="B" table="B" lazy="false">
<cache usage="read-write"/>
<id name="id" column="ID" type="java.lang.Integer">
<generator class="org.hibernate.id.enhanced.TableGenerator">
<param name="segment_value">b</param>
</generator>
</id>
<version name="olVersion" column="VERSION" type="integer" unsaved-value="negative" />
<joined-subclass name="SubB1" table="SUB_B1" lazy="false">
<key column="ID_B" foreign-key="FK_SUB_B1_B"/>
<many-to-one name="subA" column="ID_A" not-null="false" update="false" foreign-key="FK_SUB_B1" lazy="false" class="A"/>
</joined-subclass>
</class>
</hibernate-mapping>
现在的问题是:有时休眠通过加载 SubB1 的项目将 SubA2 的项目加载为 SubA1 的实例,但并非所有项目都会投错,只有少数项目,而且每次都不是相同的项目。
也许有人可以解释一下,我们的休眠映射出了什么问题或出了什么问题。
提前谢谢你。
附言。 此问题发生在:
- JDK 1.7.71
- Oracle 12g
- 休眠 3.6.10
我没有尝试其他配置。
很遗憾,我没有示例应用程序,但我也无法给出真实应用程序的源代码。
【问题讨论】:
-
你能指定你的环境(Hibernate、JDK、数据库的版本)吗?拥有完整的示例应用程序也很好。
-
@sibnick 我添加了有关 Hibernate、JDK 和数据库的信息。
-
你是应用程序多线程,集群吗?您使用什么类型的二级缓存提供程序?你能在没有缓存的情况下重复错误吗?
-
您在子类上的 Key 列不应该只是
<key column="ID">而没有_A(和_B)吗?您的 Notation 应该生成名为ID_A的列,它与ID无关,除了外键约束。这将允许有 2 个条目(在任一表中)引用某个 IDA,这可能是您的问题。您可以添加一些示例数据吗?ID在所有(子)类中应该是唯一的。 -
@sibnick 是的,我可以在禁用第二个缓存的情况下重现此错误。我们正在使用 EHCache