У меня есть фрагмент кода, который «обновляет» запись в базе данных, сначала каскадно удаляя ее, а затем заменяя ее новым объектом, потому что у меня было много проблем при попытке обновить ее в обычном режиме. Этот хак работал нормально, пока я не начал использовать некоторые отношения ManyToMany. Это отношение, которое вызывает проблемы:
@ManyToMany(cascade = CascadeType.ALL)
private Set<RefProg> refProgSet = new HashSet<RefProg>();
Он находится в доменном объекте с именем PDBEntry. Доменный объект RefProg имеет следующий фрагмент кода:
@ManyToMany(mappedBy = "refProgSet")
private Set<PDBEntry> pdbEntrySet = new HashSet<PDBEntry>();
Теперь, как вы уже догадались, все идет совершенно неправильно, когда вы пытаетесь удалить PDBEntry. Допустим, PDBEntry «ENT1» имеет RefProg «REFPROG1», а PDBEntry «ENT2» имеет тот же RefProg. Теперь, когда я пытаюсь каскадно удалить «ENT1», он также пытается удалить «REFPROG1», что должно быть невозможно, так как он все еще связан с «ENT2». Но если я не установлю RefProg для каскадного удаления, он не будет удалять связанные строки в объединяемой таблице, которую Hibernate создает для меня, и выдает ошибку, что он не может удалить PDBEntry. И поскольку Hibernate делает объединяемый файл, у меня, похоже, нет к нему доступа. Я просто слишком упрям и должен ли я использовать обновление вместо первой попытки удалить запись перед тем, как вводить новую, или есть какой-то другой способ заставить это работать? Может быть, есть какая-нибудь аннотация, чтобы каскад попал в объединяемую таблицу, и не дальше? Идеи?