2010-10-28 15 views
5

Estoy usando OpenEJB 3.1.3 integrado en Tomcat 5.5.26 y uso hibernate 3.6 como proveedor de JPA.OpenEJB con Tomcat e Hibernate y JPA

Aquí es mi persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
      xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
       http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 

    <persistence-unit name="manager1" transaction-type="JTA"> 

    <!-- provider is optional if you work with only 1 JPA provider --> 
    <!-- 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    --> 

    <jta-data-source>java:/DefaultDS</jta-data-source> 

<!-- 
    <properties> 
     <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml" /> 
    </properties> 
--> 

    </persistence-unit> 

</persistence> 

Aquí está mi código:

@Stateless 
public class MapSearchManager implements MapSearchLocal, MapSearchRemote { 
    @PersistenceContext 
    private EntityManager em; 
... 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public int queryDataSelectionNumRecords(MapSearchParamBean paramBean) { 
     Criteria c = createCriteria(paramBean); 
     c.setProjection(Projections.rowCount()); 

     List l = c.list(); 
... 
    } 
... 
} 

Cuando corro Tomcat con OpenEJB y mis archivos de guerra de aplicaciones en el mismo, el despliegue fallado con seguimiento de pila de excepción:

2010-10-27 18:13:35,374 - ERROR - Unable to deploy collapsed ear in war /wma: Exception: Creating application failed: C:\apache-tomcat-5.5.26\webapps\wma: javax/persistence/spi/ProviderUtil 
org.apache.openejb.OpenEJBException: Creating application failed: C:\apache-tomcat-5.5.26\webapps\wma: javax/persistence/spi/ProviderUtil 
     at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:666) 
     at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:449) 
     at org.apache.openejb.tomcat.catalina.TomcatWebAppBuilder.start(TomcatWebAppBuilder.java:249) 
     at org.apache.openejb.tomcat.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:58) 
     at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) 
     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4148) 
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760) 
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740) 
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544) 
     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926) 
     at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889) 
     at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492) 
     at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149) 
     at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311) 
     at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022) 
     at org.apache.catalina.core.StandardHost.start(StandardHost.java:736) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014) 
     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
     at org.apache.catalina.core.StandardService.start(StandardService.java:448) 
     at org.apache.catalina.core.StandardServer.start(StandardServer.java:700) 
     at org.apache.catalina.startup.Catalina.start(Catalina.java:552) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295) 
     at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433) 
Caused by: java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil 
     at java.lang.Class.getDeclaredConstructors0(Native Method) 
     at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
     at java.lang.Class.getConstructor0(Class.java:2699) 
     at java.lang.Class.newInstance0(Class.java:326) 
     at java.lang.Class.newInstance(Class.java:308) 
     at org.apache.openejb.assembler.classic.PersistenceBuilder.createEntityManagerFactory(PersistenceBuilder.java:179) 
     at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:489) 
     ... 27 more 

Tras la búsqueda, me encontré con la clase javax/persistence/spi/ProviderUtil es parte de Jav una especificación EE 6/JPA 2.0, que no es compatible con OpenEJB. Pero no creo que use mi JPA 2.0 en mi aplicación. Menciono específicamente en persistence.xml of 1.0. Sé que hibernate 3.6 es compatible con JPA 2.0. No sé si la API Criteria de hibernate es parte de JPA 2.0, pero eso no debería causar el problema, porque he mencionado específicamente 1.0 en persistence.xml.

Gracias por su ayuda.

Saludos

Will

Respuesta

4

Al buscar, encontró el/la persistencia/SPI/ProviderUtil es parte javax clase de Java EE 6/JPA 2.0 spec

Esto es correcto.

que no es compatible con OpenEJB.

Todavía no. Esto es rastreado por OPENEJB-1236.

Pero no creo que en mi aplicación que utilizo cualquier APP 2,0

Tanto si utiliza JPA 2.0 características o no, algunos cambios en las distintas interfaces requieren apoyo explícito de contenedores.

menciono específicamente en persistence.xml de 1.0.

Esto no hace ninguna diferencia, el contenedor todavía está tratando de cargar una implementación de JPA 2.0.

No sé si API Criterios de hibernación es parte de la APP 2,0

JPA 2.0 tiene un nuevo criterio API API pero Criterios de Hibernate es parte de ... Hibernate. Por lo que puedo ver, estás usando Hibernate API y mi sugerencia es utilizar su implementación de JPA 1.0, es decir, Hibernate EntityManager 3.4.0.GA y sus dependencias, que proporcionan esta API. No necesita JPA 2.0 de todos modos.


No hay mucha información en la red acerca de las versiones de hibernación-JPA juego. ¿Quiere decir que los proyectos Hibernate EntityManager y Annotations son las implementaciones de la especificación JPA 1.0, y el proyecto Hibernate Core contiene hibernate central (no implícita JPA) y JPA 2.0 impl?

Hibernate EntityManager es el proyecto que proporciona la implementación de JPA.

  • Hibernate EntityManager 3.4.0.GA es una JPA 1.0 aplicación
  • Hiberante EnittyManager 3.5+ es un JPA 2.0 aplicación

Se basa en Hibernate Core (y algunas otras bibliotecas). Para utilizar Hibernate EntityManager 3.4.0.GA, necesitará lo siguiente:

 
org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile 
+- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile 
+- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile 
+- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile 
+- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile 
| +- antlr:antlr:jar:2.7.6:compile 
| \- commons-collections:commons-collections:jar:3.1:compile 
+- org.slf4j:slf4j-api:jar:1.5.10:compile 
+- dom4j:dom4j:jar:1.6.1:compile 
| \- xml-apis:xml-apis:jar:1.0.b2:compile 
+- javax.transaction:jta:jar:1.1:compile 
\- javassist:javassist:jar:3.4.GA:compile 

estoy usando Maven así que sólo tengo que declarar una dependencia de hibernación-EntityManager pero si no lo hace, conseguir una bundle from SourceForge.

+0

Gracias Pascal. No hay mucha información en la red sobre la coincidencia de versiones de hibernate-jpa. ¿Quiere decir que los proyectos Hibernate EntityManager y Annotations son las implementaciones de la especificación JPA 1.0, y el proyecto Hibernate Core contiene hibernate central (no implícita JPA) y JPA 2.0 impl? Gracias de nuevo. –

Cuestiones relacionadas