ManyToMany を使用してマップされたセットを持つオブジェクトがあります。セットは、数十万の完全なものになる可能性があります。セットにメンバーを追加したい場合、新しいエントリを追加する前に、JPA がセット内のすべてのオブジェクトを引き戻します。
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name = "ROOM_USER",
joinColumns = @JoinColumn(name = "ROOM_ID"),
inverseJoinColumns = @JoinColumn(name = "USER_ID"))
private Set<User> members;
後でサービスクラスで、次のようにユーザーをセットに追加したい
room.addMember(user);
リレーションシップは遅延として宣言されているため、ルームで addMember を呼び出すと、プロキシはメンバーのセットをフェッチします。ここでの問題は、セットが大きくなると、メンバーのセットを取得するのにかなりの時間がかかることです。この場合、インデックスは正常に機能しています。mysql でクエリを調べたところ、問題は非常に単純で、ROOM_USER 結合テーブルに行を追加するだけなのに、大量のデータをプルしています。
JPA は、セット全体を引き戻さずにメンバーをセットに追加する方法を定義していますか?
JPA実装にSpringフレームワークとHibernateを使用しているその他のメモ。