2つの異なるテーブルにマップされたクラスを多対多関連をマッピングする方法?

StackOverflow https://stackoverflow.com/questions/1662122

質問

私はクーポンを持っている - POJO、2つのテーブルにマップされました。最初のマッピングは、エンティティ名「voucherA」を割り当て、TableAのにPOJOをマッピングします。第2のマッピングは、エンティティ名として「voucherB」を使用してテーブルBにPOJOをマッピングします。

今、私はまた、表Cにマッピングされた顧客の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のの、テーブルBに永続化されるように

どのように私は適切にバウチャーへの顧客からの多対多の団体のリストをマッピングするのですか?これを行うことができますか?ない場合は、顧客が使用するバウチャーがTABLEBに永続化されるように、この問題を回避するにはどのようなものに見えるでしょうか? (テーブルAのみ利用可能バウチャーではなく、使用したものが含まれています)。

役に立ちましたか?

解決

あなたのコアモデルが間違っているようです。あなたのVoucherエンティティは、おそらく多くの属性を持っている - それはCustomerで使われている後にそれらのすべてが変更できますか?私はそれを疑います。そして、まだ、あなたはあなたのスキーマが正規化されていないことを意味するあなたのAとBのテーブルでそれらを複製しています。

「使用可能」バウチャーと「使用」バウチャーはありません(またはすべきではない)同じエンティティ。私の代わりにUsedVoucherの性質(もしあれば)を「変更」あなたに多対1などに、1対多とVoucher Customerの両方にリンクするVoucherのための新しいエンティティを作成し、のみ含まれていることを示唆しています。だから、

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テーブルから削除することはできません。代わりに、論理削除を行う必要があるでしょう。

他のヒント

私の提案は同じテーブル内のすべてのバウチャーを保存することです。 (あなたのJavaコードで継承を使用している場合)を使用し、未使用のものを区別するために、あなたはブールフラグまたはディスクリミネータ値を持つことができますどちらか。

移行がひどく難しいだろうように

は、既存のデータを持っている場合でも、それはいないようです。一旦全てのバウチャーは、同じテーブル内にある、顧客との関係は単純で多対多になります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top