5

Tomcat5.5.26に組み込まれたOpenEJB3.1.3を使用しており、JPAプロバイダーとしてhibernate3.6を使用しています。

これが私の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>

これが私のコードです:

@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();
...
    }
...
}

OpenEJBとその中のアプリ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はJava EE 6 / JPA 2.0仕様の一部であり、OpenEJBではサポートされていません。しかし、私のアプリではJPA2.0を使用しているとは思いません。私は1.0のpersistence.xmlで具体的に言及しています。hibernate3.6がJPA2.0をサポートしていることは知っています。hibernateのCriteriaAPIがJPA2.0の一部であるかどうかはわかりませんが、persistence.xmlで1.0について具体的に言及しているため、問題が発生することはありません。

ご協力ありがとうございました。

よろしく

意思

4

1 に答える 1

4

検索したところ、クラスjavax / persistence / spi/ProviderUtilがJavaEE6 /JPA2.0仕様の一部であることがわかりました。

正解です。

これはOpenEJBではサポートされていません。

まだ。これは、OPENEJB-1236によって追跡されます。

しかし、私のアプリではJPA2.0を使用しているとは思いません。

JPA 2.0機能を使用するかどうかに関係なく、さまざまなインターフェースの一部の変更には、コンテナーからの明示的なサポートが必要です。

私は1.0のpersistence.xmlで具体的に言及しています。

これは何の違いもありません。コンテナはまだJPA2.0実装をロードしようとしています。

hibernateのCriteriaAPIがJPA2.0の一部であるかどうかはわかりません

JPA2.0には新しいCriteriaAPIがありますが、HibernateのCriteriaAPIは...Hibernateの一部です。私が見ることができることから、あなたはHibernate APIを使用しているので、私の提案は、そのJPA 1.0実装、つまり、このAPIを提供するHibernateEntityManager3.4.0.GAとその依存関係を使用することです。とにかくJPA2.0は必要ありません。


ネット上には、hibernate-jpaバージョンの一致に関する情報はあまりありません。つまり、HibernateEntityManagerおよびAnnotationsプロジェクトはJPA1.0仕様の実装であり、Hibernate CoreプロジェクトにはコアHibernate(非JPA impl)およびJPA 2.0 implが含まれているということですか?

Hibernate EntityManagerは、JPA実装を提供するプロジェクトです。

  • HibernateEntityManager3.4.0.GAはJPA1.0の実装です
  • HiberanteEnittyManager3.5+はJPA2.0の実装です

Hibernate Core(およびその他のライブラリ)に依存しています。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

私はMavenを使用しているので、hibernate-entitymanagerへの依存関係を宣言する必要がありますが、そうでない場合は、SourceForgeからバンドルを入手してください。

于 2010-10-28T07:15:19.470 に答える