【问题标题】:Hibernate: mapping table row in different ways based on discriminatorHibernate:基于鉴别器以不同方式映射表行
【发布时间】:2013-05-28 00:09:42
【问题描述】:

我正在寻找一种优雅的方式来使用 Hibernate 映射以下场景。

表“A”与 B 具有一对多的关系(许多 B 行对应一个 A 行)。 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 行,因此 BlackB 在两个位置结束。

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

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    好的,真的不知道为什么在检索行时没有使用描述符,但一种解决方法是在集合上使用 '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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2018-01-18
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      相关资源
      最近更新 更多