2

次のようなオブジェクト階層があります。

当事者 > 継承者 > 組織および個人 組織 > 継承者 > 顧客、ベンダー 個人 > 継承者 > 連絡先

データベースには、次のテーブル Party、Customer、Vendor、Contact があります。それらはすべて、Party テーブルに対応する行があります。

連絡先は、ベンダーまたは顧客のいずれかに属します。Contact テーブルに org_party_id のフィールドがあります。ただし、組織は顧客またはベンダーのいずれかになる可能性があるため、さまざまなテーブルを参照できる必要があります。

これを休止状態でマップする方法はありますか? または、DB/休止状態で管理するより良い方法はありますか?

4

1 に答える 1

1

org_party_idorg_party_typeの 2 つのフィールドを持つOrganizationという名前の新しいテーブルを作成します。

一致する各org_party_idは、 org_party_typeが CUSTOMERの場合はCustomer.idに一致し、 org_party_typeが VENDORの場合はVendor.idに一致します。

CustomerVendorのマッピングを Organization のサブクラスに変更します。(リファレンス マニュアルを参照してください。識別子としてorg_party_typeを設定ます。

ここで、 Contactのマッピングを Organization を指すように設定します。

これにより、 CustomersVendorsの組織部分が抽象化され、一貫して処理できるようになります。抽象化の一貫性を保つために、コード内にOrganizationインターフェースを作成することもできます。

UPDATED あなたのコメントに基づいて(そして質問を読み直しています)、結合されたサブクエリが最善の策であるように見えます. これは、サブクラスが ID によって結合されるため、実際には org_party_type を追加する必要がないことを意味します。そのようです:

   <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>

_

于 2010-06-17T15:53:43.003 に答える