IBM曾经有一个功能包将JPA 2.0放入WAS 7. WAS 8.5.5显然带有JPA 2.0。但我们有一个应用程序,我们刚刚升级到Hibernate 4,需要JPA 2.1。我无法找到WAS 8.5功能包的链接以推送到JPA 2.1。
还有其他人在WAS 8.5中使用过Hibernate 4吗?如果是这样,怎么样?如果没有功能包,我们会在javax.persistence类上获得NoSuchMethodError。
答案 0 :(得分:11)
Hibernate 4.3.7.Final 可以在Websphere Application Server 8.5.5 中使用,具有以下配置:
在您的应用中打包hibernate-jpa-2.1.jar
,并将classloader策略设置为PARENT_LAST。
Hibernate 4.3.7.Final与Websphere 8.5.5提供的JPA 2.0 API不兼容
设置JVM属性com.ibm.websphere.persistence.ApplicationsExcludedFromJpaProcessing=*以禁用Websphere JPA初始化。
如果没有这个,您将在启动期间跟随SAXParseException
,因为Websphere会尝试根据JPA 2.0架构解析persistence.xml。
Caused by: org.xml.sax.SAXParseException: expected root element {http://java.sun.com/xml/ns/persistence}persistence at com.ibm.ws.jpa.management.JaxbUnmarshaller.startElement(JaxbUnmarshaller.java:310)
在您的申请中应用work around for issue JPA-4。
报告使用 Hibernate的JPA 2 API而不是Webspheres JPA 1 API 的问题,而解决方案也适用于Hibernate的JPA 2.1 API,但有一些小的改动:
您需要将HibernatePersistence
替换为HibernatePersistenceProvider
,因为前者已被弃用。
如果没有这个,你将在启动期间跟随ClassCastException
,因为Hibernate的JPA 2.1 API将加载所有PersistenceProvider
类,包括在类路径中暴露的Websphere。
Caused by: java.lang.ClassCastException: com.ibm.websphere.persistence.PersistenceProviderImpl incompatible with javax.persistence.spi.PersistenceProvider at javax.persistence.Persistence$1.isLoaded(Persistence.java:110) at org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:56)
答案 1 :(得分:4)
Hibernate 4.2.x实现了JPA 2.0规范,我们在WebSphere 8.5.5中没有任何问题地使用它。我们将Hibernate JAR打包在WAR中,并将persistence.xml中的provider属性设置为org.hibernate.ejb.HibernatePersistence。
只有Hibernate 4.3.x需要JPA 2.1并且不能使用WebSphere 8.5.5。
答案 2 :(得分:0)
我能够使用在 Java 8 上运行的 websphere 8.5.5.13 做到这一点 通过制作一个包含
的共享库hibernate-jpa-2.1-api-1.0.2.Final.jar
hibernate-core-4.3.11.Final.jar
一切都很好。
答案 3 :(得分:-1)
在WebSphere中使用自己的持久性提供程序应该没有问题。我的建议是你在你的应用程序中打包一个JPA 2.1提供程序,并尝试将类加载器更改为最后一个父类。在这种情况下,您不会使用WebSphere提供的默认OpenJPA 2.0。相反,您将使用您选择的提供商。
希望这有帮助。
来自IBM支持门户网站的另一篇相关文章:http://www-01.ibm.com/support/docview.wss?uid=swg21672354