Java beans。List
を使用して変数を次のように定義すると、多対多の関係になります。
@Entity
@Table(name="ScD")
public class Group extends Nameable {
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
@JoinColumn(name="b_fk")
private List<R> r;
//or
private Set<R> r;
そのエラーが発生します:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'
...
Set
を使用すると、すべてがうまく機能しているようです。
多対多の関係を使用する場合、論理概念List
またはSet
にどちらを使用するかを尋ねたいと思います(リストに重複や設定がある可能性があるためですが、パフォーマンスやその他の問題はどうですか?)
リレーショナルデータベースの観点からは、これはセットです。データベースは順序を保持せず、List
を使用しても意味がなく、データベース内の順序は指定されていません(いわゆるインデックス付きコレクションを使用しない限り)。
Set
を使用すると、パフォーマンスにも大きな影響があります。 List
が使用される場合、Hibernateはその下にあるPersistentBag
コレクションを使用します。これにはいくつかのひどい特性があります。つまり、新しい関係を追加すると、最初に既存の関係がすべて削除され、次にそれらと新しい関係が挿入されます。 Set
を使用すると、新しいレコードを挿入するだけです。
3番目のこと-悪名高い複数のバッグの例外を同時にフェッチできないため、1つのエンティティに複数のList
を含めることはできません。
参照:
セットからの一意性要件はどうですか?これにより、Hibernateは、コレクションにオブジェクトが追加されるたびにすべてのオブジェクトを取得して、新しく追加されたオブジェクトが一意であることを確認しませんか?リストにはこの制限はありません。
質問が何年も前に行われたことは知っていますが、誰かがセットとリストの問題について疑わしい場合に備えて、このトピックについてコメントしたいと思います。
遅延フェッチに関しては、回避するという事実から、バッグ(インデックスのないリスト)の方が適していると思います。コレクションにオブジェクトが追加されるたびに、次の目的ですべてのオブジェクトを取得します。
間違えたら訂正してください。