Tomcat、Hibernate、JPA を使用した OpenEJB
質問
Tomcat 5.5.26 に埋め込まれた OpenEJB 3.1.3 を使用しており、JPA プロバイダーとして Hibernate 3.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 ではサポートされていません。しかし、私のアプリでは JPA 2.0 を使用していないと思います。具体的には1.0のpersistence.xmlで言及しています。Hibernate 3.6 が JPA 2.0 をサポートしていることは知っています。Hibernate の Criteria API が JPA 2.0 の一部であるかどうかはわかりませんが、persistence.xml で 1.0 について特に言及しているため、問題は発生しないはずです。
助けてくれてありがとう。
よろしく
意思
解決
検索すると、クラス javax/persistence/spi/ProviderUtil が Java EE 6/JPA 2.0 仕様の一部であることがわかりました。
これは正しいです。
これは OpenEJB ではサポートされていません。
まだ。これを追跡しているのは、 OPENEJB-1236.
しかし、私のアプリではJPA 2.0を使用していないと思います
JPA 2.0 の機能を使用するかどうかに関係なく、さまざまなインターフェースの一部の変更にはコンテナーからの明示的なサポートが必要です。
具体的には1.0のpersistence.xmlで言及しています。
これには何の違いもありません。コンテナは依然として JPA 2.0 実装をロードしようとしています。
Hibernate の Criteria API が JPA 2.0 の一部であるかどうかはわかりません
JPA 2.0 には新しい Criteria API がありますが、 Hibernate の Criteria API ...の一部です冬眠します。私が見る限り、あなたは Hibernate API を使用しているので、私の提案はその JPA 1.0 実装を使用することです。この API を提供する Hibernate EntityManager 3.4.0.GA とその依存関係。とにかく JPA 2.0 は必要ありません。
Hibernate-jpa のバージョンの一致に関する情報はネット上にあまりありません。つまり、Hibernate EntityManager および Annotations プロジェクトは JPA 1.0 仕様の実装であり、Hibernate Core プロジェクトにはコア Hibernate (非 JPA impl) と JPA 2.0 impl が含まれているということでしょうか?
Hibernate EntityManager は、JPA 実装を提供するプロジェクトです。
- Hibernate EntityManager 3.4.0.GA は JPA 1.0 実装です
- Hiberante EnittyManager 3.5+ は JPA 2.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 からのバンドル.