2010-12-27 21 views
14

Estoy usando Hibernate 3.6 y tengo mi código anotado (en comparación con el uso de archivos de asignación de hibernación). Me encontré con el conocido "problema" de utilizar las opciones de cascada de JPA que no son compatibles con CascadeType de Hibernate (consulte este enlace para obtener más información http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/).Confusión entre JPA e Hibernate en cascada

Esperaba obtener un poco más de aclaración sobre el problema. Tengo algunas preguntas en particular:

1) Entonces @Cascade ({CascadeType.SAVE_UPDATE}) funciona para saveOrUpdate(), pero ¿se aplica también si utilizo merge() o persist()? o tengo que usar los tres Hibernate CascadeTypes?

2) ¿Cómo decido si usar opciones de cascada JPA o la anotación Hibernate @Cascade en su lugar?

2) Hay un "error" presentado contra esto en Hibernate, pero los desarrolladores aparentemente ven esto como un problema de documentación, (estoy completamente en desacuerdo con ellos), y no veo que haya sido abordado en dicha documentación. ¿Alguien sabe por qué esto está "funcionando como se diseñó" y no es un error en la implementación de JPA de Hibernate?

Muchas gracias de antemano.

Respuesta

13

Este comportamiento está documentado en 11.11. Transitive persistence.

  1. Los tipos de cascada Hibernate corresponden a las operaciones individuales, por lo que necesita las tres.

  2. En la mayoría de los casos, necesita ya sea CascadeType.ALL o no en cascada. En ese caso, la anotación JPA es suficiente, ya que el CascadeType.ALL de JPA cubre todas las operaciones de Hibernate. De lo contrario, si necesita un control en cascada de granularidad (y utiliza la interfaz Session de Hibernate), necesita el @Cascade de Hibernate.

  3. No es un error en la implementación de JPA, porque si utiliza JPA EntityManager todo funciona bien. Este problema existe solo si combina anotaciones JPA con la interfaz Session de Hibernate.

+0

1. Si entiendo correctamente que Hibernate está implementando JPA, esperaba que SAVE_UPDATE de Hibernate se aplicara en cascada a persist() y merge() de JPA, pero entiendo por qué necesito las tres. – Jay

+0

2. Esto me molesta: TODO funcionará para ambos, pero si no usa TODO, Hibernate no es lo suficientemente "inteligente" como para hacer el mapeo por usted. Tampoco veo nada en la documentación de Hibernate sobre el uso de @Cascade con Hibernate Sessions (y esta es la razón por la que creo que el informe de error es válido). – Jay

+0

¡Pero MUCHAS gracias por la respuesta! – Jay

1

De la documentación de referencia de Hibernate

Para cada operación básica de la sesión de Hibernate - incluyendo persistir(), fusión(), saveOrUpdate(), eliminar(), bloqueo(), refresh(), evict (), replicar() - Hay un estilo en cascada correspondiente

Si ve CascadeType documentación, verá cada estilo en cascada para cada operación sesión

¿Cómo decido si utilizar las opciones de cascada JPA o la anotación Hibernate @Cascade en su lugar?

Prefiero utilizar el estilo de cascada JPA simple cuando se utiliza una aplicación JPA normal. Si utiliza Hibernate, prefiera el estilo de cascada de Hibernate

+0

Para su información, CascadeType.SAVE_UPDATE no se menciona en absoluto en el manual de "eliminar" se aplica a XML para el método delete(), pero CascadeType.REMOVE se aplica a las anotaciones para el método delete(). y CascadeType.REFRESH, CascadeType.EVICT y CascadeType.REPLICAR no se mencionan en el manual tampoco. – Jay