Hibernate映射使用中间表管理双向关系

时间:2010-06-17 14:55:09

标签: java hibernate hibernate-mapping

我有一个对象层次结构,如下所示。

派对>继承自>组织和人 组织>继承自>客户,供应商 人>继承自>接触

在数据库中,我有以下表格 派对,客户,供应商,联系。所有这些都在Party表中有相应的行。

联系人属于供应商或客户。我在org_party_id的Contact表上有一个字段。但是,由于组织可以是客户或供应商,因此我需要能够查看不同的表。

有没有办法在休眠中映射这个?或者,在DB / hibernate中管理它的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

创建一个名为组织的新表,其中包含2个字段 org_party_id org_party_type

如果 org_party_type 是CUSTOMER,或者 Vendor.id 每个 org_party_id 匹配 Customer.id >如果 org_party_type 是供应商。

客户供应商的映射更改为组织的子类。 (请参阅reference manual。将 org_party_type 设置为鉴别器

现在,将联系人的映射设置为指向组织。

这将抽象出客户供应商的组织部分,以便您可以始终如一地处理它们。您可能还希望在代码中创建组织接口,以便抽象一致。

<强>已更新 根据您的评论(并重读问题),看起来加入子查询是您最好的选择。这意味着您实际上不需要添加org_party_type,因为子类由ID连接。像这样:

   <class name="Party" table="PARTY">
            <id name="org_party_id" column="uid" type="long">
                    <generator class="hilo"/>
            </id>

            <!-- other PARTY properties -->

            <joined-subclass name="Customer" table="CUSTOMER">
                <key column="customer_id"/>
                <property name="name" type="string"/>

                <!-- other CUSTOMER properties -->

            </joined-subclass>

            <joined-subclass name="Vendor" table="VENDOR">
                <key column="vendor_id"/>
                <property name="name" type="string"/>

                <!-- other VENDOR properties -->

            </joined-subclass>
    </class>

_