0

できる限り単純でわかりやすいように、不自然な例で問題を説明します。ただし、私の本当の問題はレガシー コードにあるため、スキーマなどを変更することはできません。

コードにクラス階層ごとのテーブルがあります。Customer1 と Customer2 としましょう。それらには、固有の識別値 (それぞれ 1 および 2) があります。各顧客は、0 個以上のアドレスを持つことができます。アドレスは 1 つのテーブルに格納されます。このテーブルには、顧客 ID と顧客識別子の値への参照が格納されます。私が持っているアドレスマッピングでは:

<any name="customer" meta-type="CustomerMetaType" id-type="long">
    <column name="customerid" not-null="true" />
    <column name="discriminator" not-null="true" />
</any>

これで問題ありません。ただし、customer1 と customer2 のマッピングには次のものがあります。

<set name="addresses" outer-join="false">
    <key column="customerid"/>            
    <one-to-many class="Address"/>
</set>

これには、id 1 で customer1 をロードすると、id 2 で customer2 のアドレスが取得されるという問題があります。私の最初の修正の試みは、セットに複数のキーを追加することでした。

<key>
    <column name="customerid"/>
    <column name="discriminator"/>
</key>

ただし、それを行うと、次の例外が発生します。

org.hibernate.MappingException: 外部キーには、参照される主キーと同じ数の列が必要です)

誰もこれに対する解決策を持っていますか。ある種の仮想複合キーとしてディスクリミネータをクラスにマッピングする方法はありますか? または、特定の顧客テーブルに制限するためにセット マッピングでできることは他にありますか?

4

1 に答える 1

1

各顧客マッピングには where 条件が必要です

<set name="addresses" outer-join="false" where="discriminator='customer1'">
    <key column="customerid"/>            
    <one-to-many class="Address"/>
</set>

<set name="addresses" outer-join="false" where="discriminator='customer2'">
    <key column="customerid"/>            
    <one-to-many class="Address"/>
</set>
于 2012-10-04T15:04:17.927 に答える