Путаница между JPA и Hibernate каскадом
Я использую Hibernate 3.6 и хочу, чтобы мой код был аннотирован (по сравнению с использованием файлов сопоставления спящего режима). Я столкнулся с известной "проблемой" использования каскадных опций JPA, которые несовместимы с Hibernate CascadeType (см. Эту ссылку для дополнительной информации http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/).
Я надеялся получить немного больше разъяснений по этой проблеме. У меня есть некоторые вопросы:
1) Итак, @Cascade ({CascadeType.SAVE_UPDATE}) работает для saveOrUpdate(), но применяется ли это также, если я использую merge() или persist()? или мне нужно использовать все три типа Hibernate CascadeTypes?
2) Как я могу решить, использовать ли каскадные параметры JPA или аннотацию Hibernate @Cascade?
2) В Hibernate есть "ошибка", но разработчики, по-видимому, рассматривают это как проблему с документацией (я совершенно не согласен с ними), и я не вижу, что это было рассмотрено в упомянутых документация. Кто-нибудь знает, почему это "работает как запроектировано", а не ошибка в реализации Hibernate JPA?
Большое спасибо заранее.
Ответы
Ответ 1
Это поведение описано в 11.11. Переходная настойчивость.
-
Типы каскада Hibernate соответствуют отдельным операциям, поэтому вам нужно все три из них.
-
В большинстве случаев вам нужно либо CascadeType.ALL
, либо вообще не каскадировать. В этом случае достаточно аннотации JPA, так как JPA CascadeType.ALL
охватывает все операции Hibernate. В противном случае, если вам нужен мелкозернистый каскадный элемент управления (и используйте интерфейс Hibernate Session
), вам потребуется Hibernate @Cascade
.
-
Это не ошибка в реализации JPA, потому что если вы используете JPA EntityManager
, все работает нормально. Эта проблема существует, только если вы объедините аннотации JPA с интерфейсом Hibernate Session
.
Ответ 2
Из справочной документации Hibernate
Для каждой базовой операции сеанса Hibernate, включая persist(), merge(), saveOrUpdate(), delete(), lock(), refresh(), evict(), replicate() - . Существует соответствующий каскадный стиль
Если вы видите документацию CascadeType, вы увидите каждый каскадный стиль для каждой сессии.
Как я могу решить, использовать ли каскадные параметры JPA или аннотацию Hibernate @Cascade?
Предпочитаете использовать простой каскадный стиль JPA при использовании простого приложения JPA. Если вы используете Hibernate, предпочитаете каскадный стиль Hibernate