2011-08-02 20 views
7

Tengo un gran proyecto de aplicación web basado en JSF que no es Java EE. Nuestro sistema está estructurado en capas (en el sentido del código fuente): hay un paquete de modelo de datos, que se basa en el paquete DAO. Estamos utilizando la asignación de configuración XML de Hibernate exclusivamente en el paquete DAO. Realmente no queremos complicar el modelo de datos con anotaciones, pero no están específicamente vinculados a Hibernate (excepto que la asignación es bastante compleja).Migración de Hibernate a JPA sin anotaciones

Estoy considerando hacer un cambio hacia Java EE y construir nuestros objetos DAO como EJB. Pero como no estamos dispuestos a descartar XML de Hibernate, esto me lleva a varias preguntas:

  • ¿Es posible utilizar Hibernate JPA con y sin anotaciones JPA en el modelo?
  • De lo contrario, ¿es posible que mis EJB se comporten de forma transaccional con Hibernate? Creo que esto se llama soporte de JTA, pero no estoy seguro. Me gusta la idea de obtener transacciones "gratis"; en este momento tenemos un oyente de fase codificado personalizado que me gustaría eliminar, que maneja las transacciones de Hibernate.
  • ¿Hay alguna forma de migrar de la configuración de asignación XML de Hibernate a algún tipo de asignación JPA XML? No veo una manera de hacer esto, pero obviamente sería mejor reducir nuestro acoplamiento a Hibernate.

Gracias!

Respuesta

8

¿Es posible utilizar Hibernate JPA con y sin anotaciones JPA en el modelo?

Sí, esto es muy posible. Puede especificar todos los atributos pertinentes de las clases de su modelo de objeto, en el archivo de mapeo estándar JPA - orm.xml. También puede tener sus propios archivos de asignación, pero deberá especificarlos en el persistence.xml.

Si no es así, ¿es posible que mis EJB se comporten transaccionalmente con Hibernate de todos modos? Creo que esto se llama soporte de JTA, pero no estoy seguro.

Si está utilizando EJB, encontrará que las transacciones administradas por contenedor son bastante útiles. Todo lo que necesita hacer es anotar sus EJB con las anotaciones @TransactionManagement y @TransactionAttribute requeridas, y el contenedor administrará automáticamente las transacciones por usted, incluyendo la transacción al final del método (si corresponde) y el reinicio de la transacción en el evento de una excepción de tiempo de ejecución o una aplicación.

Todas las instancias de EntityManager, es decir, todos los contextos de persistencia, inyectados en tales EJB, se asociarían automáticamente con la transacción JTA subyacente. Tenga en cuenta que esto solo es cierto si permite que el contenedor inyecte instancias EntityManager. Si administra los contextos de persistencia usted mismo (creándolos desde instancias EntityManagerFactory), entonces deberá invocar EntityManager.joinTransaction() para asociar todo el trabajo realizado en el contexto de persistencia con la transacción JTA subyacente.Esto es necesario ya que el EntityManager típicamente se asocia con la transacción JTA subyacente, si ha configurado el contexto de persistencia para usar las fuentes de datos JTA. Si no existe una transacción JTA, no se producirá dicha asociación y, por lo tanto, deberá unirse a una transacción JTA activa si desea eliminar los cambios en una base de datos.

¿Hay alguna manera de migrar de la configuración de asignación de XML de Hibernate a algún tipo de asignación de JPA XML?

No conozco ninguna herramienta como nunca he tenido que migrar un proyecto, pero eso no significa que no haya ninguno para este propósito. Es posible que desee echar un vistazo al proyecto Hibernate Tools, que sí es compatible con JPA, aunque no estoy seguro de si le permitirá convertir el formato HTML de Hibernate al formato JPA.

3

Sí, JPA también admite correlaciones de XML. Además del estándar persistence.xml, tiene orm.xml y otros archivos xml que declaran entidades según un esquema xml JPA. Here is a reference.

En cuanto a los EJB transaccionales - sí, pueden ser transaccional (con o sin anotaciones JPA en el modelo)

+0

¿Y pueden ser transaccionales con maquinaria Hibernate estándar en lugar de maquinaria JPA? –

+0

Pueden ser a través de JPA seguro. Y JPA simplemente se envuelve hibernate. Mira @TransactionAttribute http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttribute.html – Bozho

Cuestiones relacionadas