deploy and spring hibernate jpa jboss

spring - deploy - Excluyendo el subsistema JPA de JBoss EAP 6.1-Intentando usar JPA 2.1 en JBoss EAP 6.1



spring boot jboss jsp (4)

Encontré una solución que parece funcionar con hibernate-core-4.3.1.

Paso 1: eliminar el subsistema jpa de standalone.xml:

<subsystem xmlns="urn:jboss:domain:jpa:1.1"> <jpa default-datasource="" default-extended-persistence-inheritance="DEEP"/> </subsystem>

Gracias a este artículo del blog: http://mariemjabloun.blogspot.nl/2014/02/jboss-eap-6-persistence-unit-problem.html

Paso 2: excluya los módulos jpa, javaee en jboss-deployment-structure.xml de la guerra:

<exclusions> <module name="javax.persistence.api"/> <module name="javaee.api"/> </exclusions>

Tengo una aplicación de guerra que contiene API JPA 2.1 e Hibernate 4.3.0.Final (implementación de JPA 2.1) empaquetada y cargada usando el contenedor Spring y quiero implementar esto en JBoss EAP 6.1.

Soy consciente de que JBoss EAP 6.1 cumple con JPA 2.0, así que decidí forzar a JBoss a utilizar la versión e implementación de JPA desde mi aplicación

Lo que intentaba hacer era excluir el subsistema JPA usando jboss-deployment-structure.xml pero lo que encontré fue que incluso si comento la extensión JPA y el subsistema JPA de standalone.xml y pongo la exclusión del subsistema JPA en jboss-deployment- structure.xml (también excluido el módulo org.hibernate para usar el hibernate empaquetado en la aplicación), no se ejecutan los escáneres JPA ( como se esperaba ), pero el momento en que cualquiera de la clase war (en mi caso Spring container) se refiere a las clases javax.persistence , la API se carga desde los módulos de JBoss (modules / system / layers / base / javax / persistence / api / main / hibernate-jpa-2.0-1.0.1.Final-redhat-2.jar!) EN LUGAR del API suministrado en la guerra suministrada. Obviamente, me sale una excepción de desajuste en la API suministrada por JBoss (2.0) y su implementación (2.1) en la aplicación de guerra. Una excepción es, por ejemplo, la propiedad relacionada con el índice de la anotación javax.persistence.Table no se reconoce, ya que es una adición en JPA 2.1 y no está disponible en JPA 2.0

Podría solucionar este problema reemplazando la API de JPA 2.0 en el directorio de módulos con JPA 2.1 (y apuntando module.xml al nuevo 2.1 API jar) y todo funcionó bien. Sin embargo, creo que esta no es la forma correcta ya que esto es como tratar de cambiar el comportamiento del servidor para todas las aplicaciones.

¿Es este el comportamiento de carga de clases de JBoss intencional que todas las clases de API de especificación (de las cuales JBoss es implementador) siempre tendrán prioridad independientemente de la implementación utilizada y no importa si le decimos que use una API particular desde dentro de la aplicación. Creo que hacer un servidor específico que cumpla con las especificaciones y luego proporcionar una manera de anular la versión de la especificación en sí es algo contradictorio, pero ¿hay alguna manera de poder usar limpiamente tanto la API como la implementación desde mi aplicación?

Otra opción sería pasar a Wildfly, que es la implementación de JPA 2.1, pero mi pregunta es si esto es perfectamente posible en JBoss EAP 6.1.


Encontramos otra solución.
También puede excluir el subsistema jpa en jboss-deployment-structure.xml de la guerra:

<exclude-subsystems> <subsystem name="jpa" /> </exclude-subsystems> <exclusions> <module name="javaee.api" /> </exclusions>


Las respuestas anteriores son excelentes, pero están introduciendo otros problemas en muchas aplicaciones al excluir toda la API de Java EE.

Si no desea hacerlo, vaya a JBOSS_HOME/modules/javaee/api/main/module.xml y establezca export a false para javax.persistence.api , así:

<module name="javax.persistence.api" export="false"/>

Tenga en cuenta que esto deshabilitará la API de persistencia para cada aplicación desplegada en el mismo EAP.

Aún necesita eliminar el subsistema JPA de standalone.xml , pero no necesita cambiar jboss-deployment-structure.xml , o al menos no tuve que hacerlo.


Si eres Maven, este fue el truco para mí.

<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency>

jboss-deployment-structure.xml

<deployment> <exclude-subsystems> <subsystem name="jpa" /> </exclude-subsystems> <exclusions> <module name="javaee.api" /> </exclusions> </deployment>