2

バウチャーがあります-POJOは2つのテーブルにマップされています。最初のマッピングでは、エンティティ名「voucherA」を割り当て、POJO を TableA にマップします。2 番目のマッピングでは、"voucherB" をエンティティ名として使用し、POJO を TableB にマップします。

これで、TableC にマッピングされた顧客の POJO もできました。この POJO は、リスト内のバウチャーを参照します。

<list name="vouchers" table="TableC_vouchers">
  <key column="pid"/>
  <list-index column="position" base="0"/>

  <!-- how to do that right -->
  <many-to-many column="voucher_id" entity-name="voucherB"/>
</list>

顧客からバウチャーへの多対多の関連付けのリストを適切にマッピングして、顧客の POJO が永続化されている場合、バウチャー エンティティがそこに存在しない場合は TableA ではなく TableB に永続化されるようにするにはどうすればよいですか? これはできますか?そうでない場合、顧客が使用したバウチャーが tableB に永続化されるようにするには、どのような回避策がありますか? (TableA には使用可能なバウチャーのみが含まれ、使用済みのバウチャーは含まれません)

4

2 に答える 2

3

あなたのコアモデルは間違っているようです。あなたのVoucherエンティティにはおそらく多くの属性がありCustomerます. 私はそれを疑います。それでも、A テーブルと B テーブルでそれらを複製しているため、スキーマが正規化されていません。

「使用可能な」バウチャーと「使用済み」のバウチャーは、同じエンティティではありません (または同じであってはなりません)。代わりに、多対一と多対一のUsedVoucher両方にリンクし、 (存在する場合)の「変更された」プロパティのみを含む新しいエンティティを作成することをお勧めします。そう、VoucherCustomerVoucher

Voucher(id, other attributes) // doesn't change from what you have now
Customer (id, other attributes) // doesn't change except for many-to-many; see below
UsedVoucher(id,
 voucher, // what Voucher was used by that customer
 customer, // what Customer has used that voucher
 changed voucher attributes, // if any
 additional attributes // if needed, such as date/time when voucher was used
)

保守可能なプロパティとして必要な場合、 「多対多」Customerは「1 対多」(この顧客が使用するバウチャーのコレクション) になります。それ以外の場合は、クエリを介して簡単に取得できます。

ただし、このシナリオではテーブルから物理的に削除することはできませんVouchers(問題のバウチャーが使用されていない場合を除きます)。代わりに、論理的な削除を行う必要があります。

于 2009-11-02T16:43:05.477 に答える
1

私の提案は、すべてのバウチャーを同じテーブルに保存することです。使用済みのものと未使用のものを区別するには、ブール値フラグまたは識別子の値を使用できます (Java コードで継承を使用している場合)。

既存のデータがある場合でも、移行はそれほど難しくないようです。すべてのバウチャーが同じテーブルに配置されると、顧客との関係は単純な多対多になります。

2 つのテーブルを維持するのは難しいと思います。基本的に、バウチャーが使用されているかどうかは引き続き保存していますが、明示的に行っているわけではありません。回避策があると確信していますが、上で概説したことははるかに簡単だと思います。私の経験では、これは、同様の問題に直面するたびに選択したルートです。

于 2009-11-02T16:34:37.803 に答える