Wil*_*kar 5 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://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>
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
@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();
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我使用OpenEJB运行tomcat并且我的app war存档时,部署失败,异常堆栈跟踪:
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
Run Code Online (Sandbox Code Playgroud)
在搜索时,我发现该类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 的一部分。据我所知,您正在使用 Hibernate API,因此我的建议是使用其 JPA 1.0 实现 - 即 Hibernate EntityManager 3.4.0.GA 及其依赖项,它们提供了此 API。无论如何,您不需要 JPA 2.0。
网上没有太多关于 hibernate-jpa 版本匹配的信息。那么您的意思是 Hibernate EntityManager 和 Annotations 项目是 JPA 1.0 规范的实现,而 Hibernate Core 项目包含核心 hibernate (非 JPA impl)和 JPA 2.0 impl 吗?
Hibernate EntityManager 是提供 JPA 实现的项目。
它依赖于 Hibernate Core(以及其他一些库)。要使用 Hibernate EntityManager 3.4.0.GA,您需要以下内容:
org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:编译 +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:编译 +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:编译 +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:编译 +- org.hibernate:hibernate-core:jar:3.3.0.SP1:编译 | +- antlr:antlr:jar:2.7.6:编译 | \- 公共集合:公共集合:jar:3.1:编译 +- org.slf4j:slf4j-api:jar:1.5.10:编译 +- dom4j:dom4j:jar:1.6.1:编译 | \- xml-apis:xml-apis:jar:1.0.b2:编译 +- javax.transaction:jta:jar:1.1:编译 \- javassist:javassist:jar:3.4.GA:编译
我使用的是 Maven,所以我只需声明对 hibernate-entitymanager 的依赖关系,但如果不这样做,请从 SourceForge 获取捆绑包。
| 归档时间: |
|
| 查看次数: |
2347 次 |
| 最近记录: |