Hibernate:基于discriminator以不同的方式映射表行



我正在寻找一种优雅的方法来映射下面的场景与Hibernate。

表'A'与B有一对多的关系(每一行A对应多个B行)。B排有"黑色"one_answers"白色"两种。此类型由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行,因此BlackB最终在两个位置。

我是在正确的轨道上,还是有更好的方法来做这件事?如有任何建议,我将不胜感激。

ok,真的不确定为什么在检索行时不使用标识符,但是一个解决方法是在集合上使用'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>

最新更新