OpenEJB与Tomcat、Hibernate和JPA

OpenEJB与Tomcat、Hibernate和JPA,hibernate,jpa,openejb,Hibernate,Jpa,Openejb,我使用嵌入在Tomcat 5.5.26中的OpenEJB 3.1.3,并使用hibernate 3.6作为JPA提供程序 以下是我的persistence.xml: <?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://w

我使用嵌入在Tomcat 5.5.26中的OpenEJB 3.1.3,并使用hibernate 3.6作为JPA提供程序

以下是我的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>
当我运行带有OpenEJB和我的app war存档的tomcat时,部署失败,出现异常堆栈跟踪:

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
搜索后,我发现类
javax/persistence/spi/ProviderUtil
是JavaEE6/JPA2.0规范的一部分,OpenEJB不支持该类。但我不认为我的应用程序中使用了任何JPA2.0。我在1.0的persistence.xml中特别提到。我知道Hibernate3.6支持JPA2.0。我不知道hibernate的CriteriaAPI是否是JPA2.0的一部分,但这不应该引起问题,因为我在persistence.xml中特别提到了1.0

谢谢你的帮助

问候

意志

搜索后,我发现类javax/persistence/spi/ProviderUtil是JavaEE6/JPA2.0规范的一部分

这是正确的

OpenEJB不支持的

还没有。这是一个由

但我不认为在我的应用程序中我使用了任何JPA2.0

无论您是否使用JPA2.0特性,各种接口中的某些更改都需要容器的显式支持

我在1.0的persistence.xml中特别提到

这没有任何区别,容器仍在尝试加载JPA2.0实现

我不知道hibernate的CriteriaAPI是否是JPA2.0的一部分

JPA2.0有一个新的CriteriaAPI,但Hibernate的CriteriaAPI是。。。冬眠。据我所见,您使用的是HibernateAPI,因此我的建议是使用它的JPA1.0实现,即Hibernate EntityManager 3.4.0.GA及其依赖项,它们提供了此API。无论如何,你不需要JPA2.0


网上没有太多关于hibernate jpa版本匹配的信息。那么,您是说Hibernate EntityManager和Annotations项目是JPA1.0规范的实现,而Hibernate核心项目包含核心Hibernate(非JPA impl)和JPA2.0 impl

Hibernate EntityManager是提供JPA实现的项目

  • Hibernate EntityManager 3.4.0.GA是JPA1.0实现
  • HibernateEnittyManager 3.5+是一个JPA2.0实现
它依赖于Hibernate核心(和其他一些库)。要使用Hibernate EntityManager 3.4.0.GA,您需要以下内容:

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 org.hibernate:hibernate entitymanager:jar:3.4.0.GA:compile +-org.hibernate:ejb3持久性:jar:1.0.2.GA:compile +-org.hibernate:hibernate commons注释:jar:3.1.0.GA:compile +-org.hibernate:hibernate注释:jar:3.4.0.GA:compile +-org.hibernate:hibernate核心: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 |\-xmlapi:xmlapi:jar:1.0.b2:compile +-事务:jta:jar:1.1:compile \-javassist:javassist:jar:3.4.GA:compile
我使用的是Maven,所以我只需要声明对hibernate entitymanager的依赖关系,但如果您不这样做,请获取一个。

谢谢Pascal。网上没有太多关于hibernate jpa版本匹配的信息。那么,您是说Hibernate EntityManager和Annotations项目是JPA1.0规范的实现,而Hibernate核心项目包含核心Hibernate(非JPA impl)和JPA2.0 impl?再次感谢。 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