У меня есть объект 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, поэтому я не уверен, как написать запрос JPQL для удаления записей из поля privs объекта роли. Например, я пробовал это, но это не работает. Он жалуется, что Role.privs не отображается.
DELETE FROM Role.privs p WHERE p.id=:privId
Я не уверен, что еще попробовать. Я мог бы, конечно, просто написать собственный запрос, который удаляет из таблицы соединений RolePrivilege. Но я беспокоюсь, что это может плохо взаимодействовать с локально кэшированными объектами, которые не будут обновляться собственным запросом.
Возможно ли вообще написать JPQL для удаления записей из таблицы соединений? Если нет, я могу просто загрузить все объекты Role и удалить записи из коллекции privs каждого из них, а затем сохранить каждую роль. Но это кажется глупым, если простой JPQL-запрос сделает все сразу.