1

Spring で使用するために、プロプライエタリ データベースを Hibernate にマッピングしています。その中には、エンティティ A とエンティティ B の次のスキーマを持ついくつかのジョイント可能オブジェクトがあります。

CREATE TABLE AjoinB (
  idA int not null,
  idB int not null,
  groupEnum enum ('groupC', 'groupD', 'groupE'),
  primary key(idA, idB, groupEnum)
);

ご覧のとおり、これは、それらを異なるグループに入れる複数の AB 関係が存在する可能性があることを示しています。エンティティ A の最初の行とエンティティ B の 2 番目の行、次のセットで終わりたいと思います

Set<B> BforGroupC, BforGroupD, BforGroupE;
Set<A> AforGroupC, AforGroupD, AforGroupE;

これまでのところ、それらを 1 つのセットにまとめて、 groupEnum 関係属性を無視することしかできませんでした。

@ManyToMany(targetEntity=B.class, cascade={ CascadeType.PERSIST, CascadeType.MERGE } )
@JoinTable(name="AjoinB", joinColumns=@JoinColumn(name="idA"), inverseJoinColumns=@JoinColumn(name="idB") )
private Set<B> BforAllGroups;

@ManyToMany( mappedBy = "BforAllGroups", targetEntity = A.class )
private Set<A> AforAllGroups;

groupC、groupD、または groupE のいずれかに属する複数のセットを作成するにはどうすればよいですか?

乾杯

ニック

4

3 に答える 3

3

これを行うことを検討している場合は、しないでください。最近は経済などの理由でテーブルが安くなっているので、関連付けごとに 1 つ作成してください。とても簡単になります。

レガシーデータベースに縛られていて、そのテーブルの構造を変更できない場合は、

  1. 最初に skaffman のソリューションを検討してください (+1、btw)。ターゲット データベースによっては、適切な「識別子」値を挿入するビューのトリガーを作成できる場合があります。

  2. DB で上記が不可能な場合、別の解決策は、コレクションの CRUD 操作にカスタム SQLを使用することです。これは、条件の一部として関連付けを含む複雑な HQL クエリでは機能しないことに注意してください (たとえば、「識別子の値」は適用されません) これを上記と組み合わせることもできます-たとえば、ビューを使用し、挿入/削除にカスタム SQL を使用します。

  3. 上記の両方が失敗した場合は、framer8 で提案されているように、「別の実体としての関連付け」に進みます。これは、複合キーとすべての無関係なコードのために、かなり醜いものになります (ここでは、テーブルを変更できないと想定しているため)。実際、関連付けのいずれかが重複を許可している場合、それは不可能な場合があります。

于 2009-11-19T16:58:43.960 に答える
3

私の知る限り、Hibernate はそのような「識別子」列を希望どおりに使用することはできません。Hibernate では、それぞれに結合テーブルが必要です。

おそらく、テーブルに追加のビューを定義して、各グループを表示できるでしょうか?

于 2009-11-19T09:35:02.103 に答える
0

リンク テーブル内のフィールドにアクセスする必要があるときはいつでも、リンク テーブルをオブジェクトと休止状態のエンティティにすることをお勧めします。A には AtoB オブジェクトのセットがあり、AtoB には B オブジェクトのセットがあります。リンクテーブルにユーザーがリンクに関連付けられているという同様の状況があります。

select joinTable.b from A a 
left join a.AtoB joinTable
where joinTable.group = 'C'

休止状態で暗黙的な結合を行うほどエレガントではありませんが、必要な制御を提供します。

于 2009-11-19T15:08:04.510 に答える