2つの異なるテーブルにマップされたクラスを多対多関連をマッピングする方法?
-
12-09-2019 - |
質問
私はクーポンを持っている - 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つのテーブルを維持することは難しいだろうと思います。基本的に、あなたはまだバウチャーが使用されているかどうかを保存しているが、あなたは明示的にそれをやっていません。私は回避策があるかもしれません確信しているが、私は私が上で概説しましたがはるかに簡単だと思います。私の経験では、これは私が同様の問題に直面するたびに選択したルートである。