我有一个对象层次结构如下。
当事人 > 继承者 > 组织和人员组织 > 继承者 > 客户、供应商人员 > 继承者 > 联系人
在数据库中,我有以下表格Party、Customer、Vendor、Contact。它们在 Party 表中都有对应的行。
联系人属于供应商或客户。我在 org_party_id 的联系人表上有一个字段。但是,由于组织可以是客户或供应商,我需要能够查看不同的表。
有没有办法在休眠中映射它?或者,在 DB/hibernate 中管理它的更好方法?
我有一个对象层次结构如下。
当事人 > 继承者 > 组织和人员组织 > 继承者 > 客户、供应商人员 > 继承者 > 联系人
在数据库中,我有以下表格Party、Customer、Vendor、Contact。它们在 Party 表中都有对应的行。
联系人属于供应商或客户。我在 org_party_id 的联系人表上有一个字段。但是,由于组织可以是客户或供应商,我需要能够查看不同的表。
有没有办法在休眠中映射它?或者,在 DB/hibernate 中管理它的更好方法?
创建一个名为Organization的新表,其中包含 2 个字段org_party_id和org_party_type。
如果org_party_type是 CUSTOMER,则每个org_party_id匹配一个Customer.id ,如果org_party_type是 VENDOR,则匹配一个Vendor.id。
将客户和供应商的映射更改为组织的子类。(参见参考手册。将org_party_type设置为鉴别器。
现在,将Contact的映射设置为指向 Organization。
这将抽象出客户和供应商的组织部分,以便您可以始终如一地处理它们。您可能还想在代码中创建一个组织接口,以便抽象是一致的。
更新 根据您的评论(并重新阅读问题),看起来加入子查询是您最好的选择。这意味着您实际上不需要添加 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>
_