Путаница между 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