2010-06-17 57 views
2

我有一个如下的对象层次结构。使用中间表来管理双向关系的休眠映射

方>由>组织和个人 组织继承>由>客户继承,供应商 人>由>联系

在我有以下表 党,客户,供应商,联系人数据库继承。他们在Party表中都有相应的行。

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

有没有办法在休眠状态下映射它?或者,在DB/Hibernate中管理它的更好方法是?

回答

1

创建一个新的表名为组织有2场org_party_idorg_party_type

每个org_party_id匹配对子级匹配Customer.id如果org_party_type是客户或一个Vendor.id如果org_party_type是VENDOR。

更改的映射客户供应商成为组织的子类。 (见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> 

_

+0

更新 - 使用常规的子类,而不是一个连接子类。 – 2010-06-17 16:42:20

+0

您是否建议将客户和供应商表合并到组织表中或创建其他组织表?我不能做前者。如果是后者,组织表如何与党表不同。我可以在派对桌上添加一个类型。 – shikarishambu 2010-06-17 18:44:17

+0

你是对的 - 与党没有什么不同。将该类型添加到Party,然后制作Vendor和Customer子类。 – 2010-06-17 20:15:36