2010-10-01 15 views
7

Estoy tratando de utilizar Hibernate 3.5.5 con la primavera HibernateJpaVendorAdapter en GlassFish V2, pero me estoy haciendo la siguiente excepción cuando se inicializa el contexto de primavera:Actualizar Glassfish v2 a JPA 2.0?

java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getSharedCacheMode()Ljavax/persistence/SharedCacheMode; 

en org.hibernate.ejb.util.LogHelper .logPersistenceUnitInfo (LogHelper.java:39) en org.hibernate.ejb.Ejb3Configuration.configure (Ejb3Configuration.java:517) en org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory (HibernatePersistence.java:73)

El El problema es que Glassfish V2 usa JPA1.0 que se carga en el classpath del servidor antes de hibernate-jpa -2.0-api-1.0.0.Final.jar que se envía con Hibernate. JPA 1.0 no tiene un método getSharedCacheModel en PersistenceUnitInfo, pero JPA 2.0 sí lo tiene.

¿Hay alguna forma de actualizar Glassfish V2 para usar JPA 2.0 (o cualquier otra solución a este problema)?

Cheers,

J

+0

actualización Quiera GlassFish 3 ser una opción? –

Respuesta

4

Usted puede intentar poner el frasco JPA 2.0 en el /domain/lib/endorsed dir

+0

Wow, debo admitir que estoy sorprendido. Ni siquiera entiendo cómo esto puede funcionar (es decir, sin romper el contenedor administrado JPA). –

+0

Pascal Thivent, creo que los recipientes colocados allí son preferidos en lugar de las librerías de contenedor. No es que haya usado eso (usé Glassfish hace 2 años), pero pensé que puedo sugerirlo. :) – Bozho

+1

Esto no funciona para mí. Quiso decir: $ GLASSFISH_HOME/domains/domain1/lib/endorsed or $ GLASSFISH_HOME/lib/endorsed? Gracias. –

0

Que yo sepa, no es posible actualizar Java EE 5 contenedores bibliotecas del núcleo de la APP simplemente reemplazando bibliotecas y para usar un contenedor administrado EntidadObjeto JPA 2.0.

Sin embargo, debería ser posible utilizar una implementación JPA 2.0 con la biblioteca API JPA 2.0 proporcionada en el nivel de aplicación y utilizar una aplicación administrada JPA 2.0 EntityManager.

Para probar el segundo enfoque con GlassFish v2, deberá desactivar la delegación del cargador de clases (para que las bibliotecas de aplicaciones se utilicen primero). Esto se puede configurar en un sun-web.xml que se le envasa bajo WEB-INF:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app 
     PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN" 
     "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd"> 
<sun-web-app error-url=""> 
    <class-loader delegate="false"/> 
</sun-web-app> 
+0

hm, alguien ha votado negativamente esto ... aquí viene una corrección. – Bozho

+1

Esto no funcionará en este caso, según la documentación de Glassfish: "Para varios paquetes, incluidos java. * Y javax. *, La resolución del símbolo siempre se delega al cargador de clases padre independientemente de la configuración del delegado. anulando las clases de ejecución Java centrales o cambiando las versiones API de las especificaciones que forman parte de la plataforma Java EE ". –

1

Gracias por los chicos de retroalimentación. Poner el jpa jar en/domain/lib/endorsed funcionó para mí.

configuración ...

<sun-web-app error-url=""> 
    <class-loader delegate="false"/> 
</sun-web-app> 

... no funcionó para mí a pesar de que sólo podría ser porque las clases son parte de javax.

También intenté eliminar Spring's JPATemplate y usar JPA @PersistenceContext EntityManager directamente, aunque esto causó todo tipo de problemas. Glassfish v2 + Spring + Hibernate no son amigos!

Cuestiones relacionadas