У меня следующий класс:
public String sport;
public String date;
public String time;
@ManyToOne
public Location location;
public int min, max;
// 0 - public, 1 - invite only
public int scope;
@ManyToOne
public User creator;
@ElementCollection
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "games_attendees")
public List<User> attendees;
@ElementCollection
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "games_subs")
public List<User> subs;
@ElementCollection
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "games_invitees")
public List<User> invitees;
У меня нет реляционных сопоставлений в User, поскольку я не думаю, что мне нужно, чтобы это было двунаправленным.
Всякий раз, когда я пытаюсь удалить экземпляр игры, я получаю такую ошибку:
org.hibernate.exception.ConstraintViolationException: could not execute update query
Caused by: org.postgresql.util.PSQLException: ERROR: update or delete on table "games" violates foreign key constraint "fkc80e3afb4429c99e" on table "games_attendees"
Detail: Key (id)=(3) is still referenced from table "games_attendees".
Я пробовал всевозможные комбинации LAZY / EAGER и различных типов каскадирования и не могу понять этого. Здесь есть еще несколько сообщений, но я не хочу, чтобы пользователь удалялся, а только строку из таблицы games_attendees.
* Обновление: * После некоторого устранения неполадок я решил попробовать выполнить собственный запрос перед оператором удаления, который просто удаляет все строки из таблицы games_attendees (таблица соединения), где совпадают game_ids. Это дает желаемый результат, но, похоже, это способ борьбы с JPA. Есть ли способ лучше?
CascadeType.REFRESH? - person Angga   schedule 05.07.2013