Проблемы с Hibernate, Persistence и @OneToMany и @ManyToOne - PullRequest
3 голосов
/ 13 августа 2010

У меня возникли проблемы с аннотациями @OneToMany и @ManyToOne.

У меня есть два класса Suite и SuiteVersion.SuiteVersion зависит от комплекта.Итак, я реализовал это в своем коде:

Class Suite:

@OneToMany(mappedBy = "suite")
@Cascade(CascadeType.DELETE_ORPHAN)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();

Class SuiteVersion:

@ManyToOne()
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
private Suite suite;

Но у меня возникают некоторые проблемы при удалении Suite, чейесть SuiteVersion, связанный.Hibernate не удаляет SuiteVersion до Suite.Я не знаю почему, потому что я упомянул это в своем коде:

@Cascade(CascadeType.DELETE_ORPHAN)

Этот журнал я получил, когда я удаляю suite:

Hibernate: удалить из SUITE, где ID_SUITE =?13 августа 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions ВНИМАНИЕ: Ошибка SQL: -8, SQLState: 23504 13 августа 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions GRAVE: нарушение ограничения целостности: внешнийключ не действует;FK42895651EA304E6 стол: SUITE_VERSION

Заранее благодарю за помощь.

С наилучшими пожеланиями,

Флоран,

PS: Извините за мой английскийя француз.

1 Ответ

2 голосов
/ 13 августа 2010

Но у меня возникает проблема, когда я удаляю 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 в вашей ассоциации OneToManyOneToOne). Как это:

@OneToMany(mappedBy = "suite", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();

Но это выходит за рамки этого вопроса, поскольку на самом деле это не то, что вы ищете.

...