2010-07-06 14 views
10

Estoy intentando actualizar a Hibernate 3.5.3-FINAL.Hibernate 3.5.x: NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval

Al ejecutar mis pruebas de unidad, ahora recibirá la siguiente excepción:

java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z 
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1837) 

Mi ruta de clase contiene la siguiente JAR:

Desde el dist de hibernación:

antlr-2.7.6.jar 
commons-collections-3.1.jar 
dom4j-1.6.1.jar 
javassist-3.9.0.GA.jar 
jta-1.1.jar 
slf4j-api-1.5.8.jar 

cglib-2.2.jar 
hibernate-jpa-2.0-api-1.0.0.Final.jar 
hibernate3.jar 

Otros frascos:

blazeds-common-3.2.0.3978.jar 
blazeds-core-3.2.0.3978.jar 
blazeds-opt-3.2.0.3978.jar 
blazeds-proxy-3.2.0.3978.jar 
blazeds-remoting-3.2.0.3978.jar 
commons-lang-2.3.jar 
dbunit-2.4.7.jar 
ejb3-persistence.jar // Note, I've tried excluding this, but I get different errors 
guava-r05.jar 
hsqldb-1.8.0.7.jar 
junit-4.1.jar 
lambdaj-2.0-with-dependencies.jar 
log4j-1.2.14.jar 
mockito-all-1.8.0.jar 
persistence-api-1.0.jar 
spring-security-core-2.0.0.jar 
spring.jar 
sqljdbc.jar 

He investigado esto, y ese estado find answers mi servidor web debe ser compatible JPA2:

Unfortunately if your app server is not JPA 2 compliant, you are likely to be out of luck

Este proyecto es una biblioteca, no un proyecto de servidor web. (Aunque finalmente se implementa en un servidor web, simplemente estoy ejecutando pruebas de unidades aquí)

¿Qué me estoy perdiendo?

<indulgent_rant>

Como comentario, es muy frustrante que cada vez que la actualización de hibernación, me encuentro de pasar horas investigando los tarros en conflicto para MethodNotFoundException o ClassNotFoundException 's. Debe haber una manera más simple?

Pensé con certeza que con el anuncio de que estaban fusionando los módulos a un solo proyecto central, ¿estos conflictos desaparecerían?

</indulgent_rant>

Respuesta

18

Según lo señalado por Timo, quite persistence-api-1.0.jar.

Por si acaso, aquí son las dependencias que estoy usando:

 
org.hibernate:hibernate-entitymanager:jar:3.5.3-Final:compile 
+- org.hibernate:hibernate-core:jar:3.5.3-Final:compile 
| +- antlr:antlr:jar:2.7.6:compile 
| +- commons-collections:commons-collections:jar:3.2:compile 
| +- dom4j:dom4j:jar:1.6.1:compile 
| | \- xml-apis:xml-apis:jar:1.0.b2:compile 
| \- javax.transaction:jta:jar:1.1:compile 
+- org.hibernate:hibernate-annotations:jar:3.5.3-Final:compile 
| \- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile 
+- cglib:cglib:jar:2.2:compile 
| \- asm:asm:jar:3.1:compile 
+- javassist:javassist:jar:3.9.0.GA:compile 
\- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile 

los estoy consiguiendo de esta declaración única en mi pom.xml:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>3.5.3-Final</version> 
</dependency> 

Esto debe de alguna manera responder a su indulgente rant (si reformulo: use Maven, o sepa lo que está haciendo).

+0

¿No es la presencia de hibernate-core 3.5.3 e hibernate-jpa-2.0-api 1.0.0 conflictiva, ya que ambas contienen la clase OneToMany? – acalypso

+2

No están en conflicto, porque tienen diferentes espacios de nombres. Hay javax.persistence.OneToMany, y el otro es org.hibernate.mapping.OneToMany. –

+0

No sé para qué ... pero trabajo xD! – wrivas

2

Trate de reemplazar persistencia-api-1.0.jar con un 2,0 tarro JPA.

9

eliminar estos archivos de proyecto de localización lib persistencia-api-1.0.jar ejb3-persistence.jar

agregar sólo javax.persistence-2.0.0.jar

que contiene toda la requerida campos y atributos.

intente esto, funcionará para su problema.

Manish Jaiswal

+0

Plus One para esto, también debe excluir 'ejb3-persistence.jar' si obtiene este error. –

1

añadiendo javax.persistence-2.0.0.jar debería funcionar bien ...

2

descubierto una solución para el problema, al menos, con lo que estoy trabajando con: IBM WebSphere 7 y MyEclipse Azul (primavera), o Bling, ver. 10.6. Creé una aplicación que tiene dependencias en otros proyectos, uno de ellos utilizando Hibernate 3.6.3, que requiere JPA 2.0. IBM WS carga JPA 1.0 para admitirse a sí mismo antes que JPA 2.0 y resuelve todas las referencias a JPA. 1.0. En el caso de IBM WS, esto causa el error informado anteriormente. La única solución que he encontrado ya que ahora incluye la adición de JPA 2.0 como una biblioteca compartida, a continuación, configurar el servidor para cargar la biblioteca por delante de sus clases nativas, similar al método discutido aquí:

http://www.mkyong.com/websphere/websphere-7-javaxpersistenceonetomany-orphanremoval-error/

Pero nuestra los administradores del servidor no permitirán cambios en la política del cargador de clases en todo el servidor. Así que todavía necesitaba encontrar una manera de hacer que mi proyecto utilizara JPA 2.0 y no 1.0. Intenté muchas cosas, pero finalmente opté por un Ave María y funcionó.

La solución es agregar el archivo JPA 2.0 .jar a sus proyectos .war y .ear y luego editar la línea Class-Path en el archivo de manifiesto en sus proyectos .war y .ear para apuntar al .jar archivos. Parece que deben estar en ambos o el enfoque no funcionará, por lo que el JPA 2.0 .jar debe estar tanto en .war como en .ear.

En su aplicación (proyecto .war), agregue hibernate-jpa-2.0-api-1.0.0.Final.jar a la raíz del proyecto. MyEclipse Blue lo mostrará como un archivo en esa ubicación y también se enumerará en "Bibliotecas a las que se hace referencia" en la vista del Explorador de paquetes. A continuación, abra el archivo de manifiesto en /WebRoot/META-INF/MANIFEST.MF y asegúrese de que la línea Class-Path lee:

Class-Path: /hibernate-jpa-2.0-api-1.0.0.Final.jar 

En su proyecto .ear, añadir hibernación-APP-2,0-api-1.0. 0.Final.jar a la carpeta 'lib' en la raíz del proyecto. Si no hay una carpeta 'lib' allí, crea una. Luego, en /META-INF/MANIFEST.MF, asegúrese de que la línea de Class-Path lee:

Class-Path: /lib/hibernate-jpa-2.0-api-1.0.0.Final.jar 

Asegúrese de que todos los archivos se guardan y se hace una compilación limpia. A continuación, exporte .ear e impleméntelo de la forma habitual mediante Integrated Solutions Console. Pero hay otra cosa que debe hacer antes de que el cambio funcione; requiere cambiar la política de carga de clase para la aplicación, pero no el servidor. Es mucho más probable que le pidas a tu administrador WAS que cambie la política del cargador de clases para todo el servidor. Para realizar el cambio necesario, después de instalar el archivo .ear, siga la barra de navegación izquierda, haga clic en el sendero "Applications\Application Types\Websphere enterprise applications" y haga clic en el nombre de su aplicación, luego haga clic en "Class loading y update detection". Luego seleccione "Classes loaded with local class loader first (parent last)" bajo "Class loader order", luego haga clic en Apply, entonces Save Ahora, de vuelta en el rastro clic "Applications\Application Types\Websphere enterprise applications", ya sea iniciar o reiniciar la aplicación de prueba a cabo su aplicación y esperamos que pueda ser bueno para ir

nota final:... tiempo Evey que volver a instalar el archivo de .ear, Necesitará configurar la opción del cargador de clases que acabo de discutir. La preferencia no se conserva entre las implementaciones.

+0

Maven clean FTW. Eliminé hibernate-jpa de pom pero todavía recibí el error y olvidé limpiarlo durante 3 días :(! GRACIAS! – Atais

+0

¡Esto también me funcionó! Estoy usando WebSphere 7 con MyEclipse Blue Edition. Hay una manera para conservar los cambios del cargador de clases en MyEclipse. 1. Desde MyEclipse, abra el archivo META-INF/ibmconfig/application.xml en el proyecto EAR. 2. Seleccione la pestaña "Configuración de la aplicación" 3. Debajo de " Sección "Classloader configuration", expanda el proyecto EAR. 4. Seleccione el proyecto WAR, luego elija "PARENT_LAST" para el "modo Classloader". 5. Seleccione el proyecto EAR, luego elija "PARENT_LAST" para el "modo Classloader". 6. Es posible que deba actualizar Deven del proyecto Maven y Confi del proyecto guraciones. –

+0

@red tiger: gracias por el consejo, lo intentaré. –

0

Al establecer la política del cargador de clases de la aplicación del servidor como principal resolverá este problema siempre que se asegure de que el archivo jar hibernate-jpa-2.0-api esté incluido en el EAR. Si esto es posible en su entorno, es una solución mucho más fácil.

Probado en WebSphere 7.