7

リンクテーブルに追加のフィールドがある場合、多対多の関係があります。したがって、関係は、以下のチュートリアルに従って 2 つの一対多の関係で行われます。

http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/comment-page-1/#comment-122181

リンクテーブルを定義し、@Embeddable IDフィールドで構成される3番目のエンティティの2つのエンティティがあります。

関係は次のように定義されます。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.compound", cascade = CascadeType.ALL)

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure", cascade = CascadeType.ALL)

pk = @Embeddable ID フィールド。挿入と削除は正常に機能しますが、呼び出すと

session.merge(compound);

私は StackOverflowError を取得し、ログは hibernate が大量の select ステートメントを作成していることを示しています。データベースには 1 つの関連付けが含まれていることに注意してください。2 つの構造を含む 1 つの化合物。休止状態が無限ループに入るようです。

http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/でもこのソリューションを見ましたが、どのようにこれで更新しますか?

4

2 に答える 2

3

私の解決策は、所有側で FetchType.EAGER を使用し、子側で FetchType.Lazy を使用し、リンク テーブルの 2 つの ManyToOne リレーションで使用することでした。このように、LazyInitializationException と Mergign が期待どおりに動作することなく、所有側からロードできます。

于 2012-10-09T12:40:09.510 に答える
0

私は SpaceTuckker の答えに 2 番目です。Persist は merge と同じではないと思います。Merge は永続化する前にオブジェクトをロードします。持続しません。したがって、merge IMHO を呼び出すときは、遅延関係をロードする必要があります。persist を呼び出すと、それは行われません。

@ElementDependent を使用して、関連する @OneToMany 関係を別のテーブルに依存しているとマークすることもできます。これは、結合テーブルに列を追加して多対多の関係を解決する方法でした。

于 2012-10-08T13:23:55.337 に答える