example java hibernate maven jpa openshift

java - jpa hibernate example



NoSuchMethodError: javax.persistence.JoinColumn.foreignKey() (2)

Agregue esta dependencia de Maven a su pom.xml:

<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

Estoy tratando de implementar mi aplicación en OpenShift (JBoss Enterprise Application Platform 6) y obtengo el NoSuchMethodError mencionado en el título. Así que busqué en Google todo el asunto y encontré algunos artículos o temas que mencionaban que este Método está disponible desde JPA-API 2.1. Descubrí que una dependencia necesaria para Openshift contiene la JPA-API 2.0. Traté de excluir esta dependencia pero no funciona. ¿Algunas ideas? Por favor encuentre el pom.xml a continuación.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>christmasmarkets</groupId> <artifactId>christmasmarkets</artifactId> <packaging>war</packaging> <version>1.0</version> <name>christmasmarkets</name> <repositories> <repository> <id>eap</id> <url>http://maven.repository.redhat.com/techpreview/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>springsource-repo</id> <name>SpringSource Repository</name> <url>http://repo.springsource.org/release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>eap</id> <url>http://maven.repository.redhat.com/techpreview/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.6</maven.compiler.source> <maven.compiler.target>1.6</maven.compiler.target> <spring.version>4.1.2.RELEASE</spring.version> <hibernate.version>4.3.7.Final</hibernate.version> <hibernate-annotations.version>3.5.6-Final</hibernate-annotations.version> <hibernate-commons-annotations.version>3.2.0.Final</hibernate-commons-annotations.version> <jackson.version>2.2.3</jackson.version> <postgre.version>9.3-1102-jdbc41</postgre.version> </properties> <dependencies> <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-6.0</artifactId> <version>3.0.2.Final-redhat-4</version> <type>pom</type> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>${postgre.version}</version> </dependency> </dependencies> <profiles> <profile> <!-- When built in OpenShift the ''openshift'' profile will be used when invoking mvn. --> <!-- Use this profile for any OpenShift specific customization your app will need. --> <!-- By default that is to put the resulting archive into the ''deployments'' folder. --> <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html --> <id>openshift</id> <build> <finalName>christmasmarkets</finalName> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <outputDirectory>deployments</outputDirectory> <warName>ROOT</warName> </configuration> </plugin> </plugins> </build> </profile> </profiles>


El problema aquí es que el contenedor proporciona JPA 2.0 en tiempo de ejecución . La exclusión de la dependencia proporcionada en pom.xml tiene efecto solo en tiempo de compilación. Para resolver este problema, debe configurar la carga de clase en el contenedor.

La compatibilidad con OpenShift JavaEE 6 se basa en JBoss AS 7. Desde la carga de clases en la documentación de AS7 :

jboss-deployment-structure.xml es un descriptor de implementación específico de JBoss que se puede utilizar para controlar la carga de clases de una manera detallada. Se debe colocar en la implementación de nivel superior, en META-INF (o WEB-INF para implementaciones web). Puede hacer lo siguiente:

Prevent automatic dependencies from being added Add additional dependencies ...

Entonces, lo que necesita es agregar un archivo personalizado jboss-deployment-structure.xml para excluir que hibernate-jpa-2.0-api se agregue automáticamente.

Basado en la documentación de OpenShift :

<jboss-deployment-structure> <deployment> <exclusions> <module name="javax.persistence.api" /> </exclusions> </deployment> </jboss-deployment-structure>