Путаница между JPA и каскадом Hibernate - PullRequest
14 голосов
/ 27 декабря 2010

Я использую Hibernate 3.6 и аннотирую свой код (по сравнению с использованием файлов отображения hibernate). Я столкнулся с известной «проблемой» использования каскадных опций JPA, которые не совместимы с CascadeType в Hibernate (дополнительную информацию см. По этой ссылке 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 подана «ошибка», но разработчики видят это как проблему с документацией (я с ними совершенно не согласен), и я не вижу, чтобы она была устранена в документация. Кто-нибудь знает, почему это «работает как задумано», а не ошибка в реализации JPA Hibernate?

Большое спасибо заранее.

Ответы [ 2 ]

13 голосов
/ 27 декабря 2010

Это поведение описано в 11.11.Переходное постоянство .

  1. Типы каскадов гибернации соответствуют отдельным операциям, поэтому вам необходимо все три из них.

  2. В большинстве случаеввам нужно либо CascadeType.ALL, либо не каскадировать вообще.В этом случае достаточно JPA-аннотации, поскольку JPA CascadeType.ALL также охватывает все операции Hibernate.В противном случае, если вам нужно детализированное каскадное управление (и использовать интерфейс Session Hibernate), вам нужен @Cascade.

  3. Hibernate. Это не ошибка в реализации JPA, потому что если выиспользуйте JPA EntityManager все работает отлично.Эта проблема существует, только если вы объединяете аннотации JPA с интерфейсом Session в Hibernate.

1 голос
/ 27 декабря 2010

Из справочной документации по Hibernate

Для каждой базовой операции сеанса Hibernate - включая persist (), merge (), saveOrUpdate (), delete (), lock (), refresh (),evict (), replicate () - Существует соответствующий каскадный стиль

Если вы видите документацию CascadeType , вы увидите каждый каскадный стиль для каждого сеансаоперация

Как решить, использовать ли вместо этого параметры каскада JPA или аннотацию Hibernate @Cascade?

Предпочитать использовать простой каскадный стиль JPA при использовании простого приложения JPA,Если вы используете Hibernate, предпочтите Hibernate каскадный стиль

...