Но у меня возникает проблема, когда я удаляю Suite, с которым связан SuiteVersion. Hibernate не удаляйте SuiteVersion
до Suite
.
Это потому, что вы НЕ каскадируете операцию REMOVE
с Suite
до SuiteVersion
. Чтобы получить желаемый результат, вам нужно что-то вроде этого (при условии, что вы используете JPA 1.0):
@OneToMany(mappedBy = "suite", cascade = javax.persistence.CascadeType.REMOVE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();
Я использовал полностью квалифицированные имена, чтобы ясно показать специфичные для Hibernate и стандартные аннотации JPA здесь.
Специфичный для Hibernate CascadeType.DELETE_ORPHAN
- это нечто иное, он используется для указания Hibernate на удаление определенного SuiteVersion
, если вы удалите его из коллекции (без него запись SuiteVersion
будет обновлен, чтобы удалить ссылку на родителя Suite
, но останется в таблице, будучи, таким образом, "сиротой").
Обратите внимание, что если вы используете JPA 2.0 (т. Е. Hibernate 3.5+), то теперь существует стандартный способ работы с потерянными записями, т. Е. Без использования специальной аннотации Hibernate. Вы можете указать опцию orphanRemoval
в вашей ассоциации OneToMany
(и OneToOne
). Как это:
@OneToMany(mappedBy = "suite", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();
Но это выходит за рамки этого вопроса, поскольку на самом деле это не то, что вы ищете.