次のような多対多の関係を持つ JPA オブジェクトがあります。
@Entity
public class Role {
//...
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
name="RolePrivilege",
joinColumns=
@JoinColumn(name="role", referencedColumnName="ID"),
inverseJoinColumns=
@JoinColumn(name="privilege", referencedColumnName="ID")
)
private Set<Privilege> privs;
}
RolePrivilege の JPA オブジェクトがないため、ロール オブジェクトの privs フィールドからエントリを削除する JPQL クエリの記述方法がわかりません。たとえば、私はこれを試しましたが、うまくいきません。Role.privs がマップされていないと文句を言います。
DELETE FROM Role.privs p WHERE p.id=:privId
他に何を試すべきかわかりません。もちろん、結合テーブル RolePrivilege から削除するネイティブ クエリを作成することもできます。しかし、そうすることで、ネイティブ クエリによって更新されないローカルにキャッシュされたオブジェクトとのやり取りがうまくいかないのではないかと心配しています。
このような結合テーブルからエントリを削除するためにJPQLを書くことさえ可能ですか? そうでない場合は、すべての Role オブジェクトをロードし、それぞれの privs コレクションからエントリを削除してから、各ロールを永続化できます。しかし、単純な JPQL クエリですべてを一度に実行できるのであれば、それを行うのはばかげているように思えます。