我正在寻找一种优雅的方法来使用Hibernate映射以下场景。
表'A'与B具有一对多的关系(每行A行有很多B行)。 B行有两种类型 - “黑色”和“白色”。该类型由B中的整数鉴别器列指定。
总会有一个黑B行和许多白B行。因此,我想将黑色B映射为A上的单独属性,并将剩余的白色B映射为列表。
我做了一个非常快速的测试,我尝试应用每个类的表层次映射策略:
<class name="test.class.A" table="A_TABLE">
<one-to-one name="blackItem" class="test.class.B" property-ref="parentA" />
<set name="whiteItems" inverse="true">
<key column="OID" />
<one-to-many entity-name="WhiteB" />
</set>
</class>
<class name="test.class.B" table="B_TABLE" discriminator-value="1">
<id name="oid" type="long" column="OID">
<generator class="sequence">bla</generator>
</id>
<discriminator column="B_TYPE_CODE" type="integer" />
<many-to-one name="parentA" class="test.class.A" cascade="save-update">
<column name="A_OID" not-null="true" />
</many-to-one>
<subclass name="test.class.B" discriminator-value="2" entity-name="WhiteB" />
</class>
保存时此功能正常,但查找时出现问题。当我从数据库中检索A时,A.whiteItems集合包含白色和黑色B行。一对一正确检索BlackB行,因此BlackBerry会在两个地方都结束。
我是在正确的轨道上,还是有更好的方法来做到这一点?任何建议将不胜感激。
答案 0 :(得分:0)
好的,真的不确定为什么在检索行时没有使用鉴别器,但解决方法是使用集合上的'where'属性:
<class name="test.class.A" table="A_TABLE">
<one-to-one name="blackItem" class="test.class.B" property-ref="parentA" />
<set name="whiteItems" inverse="true" where="B_TYPE_CODE=2">
<key column="OID" />
<one-to-many entity-name="WhiteB" />
</set>