【问题标题】:Websphere 8.5 with JPA 2.1带有 JPA 2.1 的 Websphere 8.5
【发布时间】:2014-07-07 20:57:52
【问题描述】:

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。

【问题讨论】:

    标签: hibernate jpa websphere


    【解决方案1】:

    Hibernate 4.3.7.Final 可以在 Websphere Application Server 8.5.5 中使用,配置如下:

    • 在您的应用程序中打包 hibernate-jpa-2.1.jar 并将类加载器策略设置为 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。

    引起:org.xml.sax.SAXParseException:预期的根元素 {http://java.sun.com/xml/ns/persistence}persistence 在 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 类。

    引起:java.lang.ClassCastException: com.ibm.websphere.persistence.PersistenceProviderImpl 与 javax.persistence.spi.PersistenceProvider 不兼容 在 javax.persistence.Persistence$1.isLoaded(Persistence.java:110) 在 org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:56)

    【讨论】:

    • 这是对 Spring gist.github.com/jeffsheets/aec3e94870ef903ce7efe33e00563d3c 进行修改的解决方法的要点另外,它似乎对我有用,而无需执行 ApplicationsExcludedFromJpaProcesssing 步骤,但也许只是幸运
    • 嗨@Parker Wang 你能解释一下如何使用我自己的PersistenceProviderResolver吗?
    【解决方案2】:

    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。

    【讨论】:

    • 所以不需要将类加载器策略更改为 PARENT_LAST?
    • 因为在官方 WAS 说明中建议将类加载器设置为 PARENT_LAST(列表中的第 3 项)www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/…
    • 我收到 CWWJP9991W:openjpa.Runtime:警告:使用 JPAPUnitInfo 注册 ClassTransformer 时出错
    【解决方案3】:

    我能够使用在 Java 8 上运行的 websphere 8.5.5.13 做到这一点 通过制作一个包含

    的共享库
    • hibernate-jpa-2.1-api-1.0.2.Final.jar

    • hibernate-core-4.3.11.Final.jar

    一切都很好。

    【讨论】:

      【解决方案4】:

      在 WebSphere 中使用自己的持久性提供程序应该没有问题。我的建议是让您在您的应用程序中打包一个 JPA 2.1 提供程序,并尝试将类加载器更改为最后的父级。在这种情况下,您不会使用 WebSphere 提供的默认 OpenJPA 2.0。相反,您将使用您选择的提供商。

      http://www-01.ibm.com/support/knowledgecenter/api/content/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/tejb_jpa3rdparty.html

      http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/trun_classload_server.html?cp=SSAW57_8.5.5%2F3-8-2-5-1&lang=en

      希望这会有所帮助。

      来自 IBM 支持门户的另一篇相关文章:http://www-01.ibm.com/support/docview.wss?uid=swg21672354

      【讨论】:

      • 来自您的链接:“使用 JPA 功能的 Java EE 应用程序可以使用第三方持久性提供程序,而不是应用程序服务器中包含的提供程序。应用程序还可以指定一个 Apache OpenJPA 提供程序,它是只要支持相同版本的 JPA 规范,就可以使用与应用程序服务器中包含的版本不同的版本。”该操作要求 2.1 而不是 2.0 交换。使用 2.0 的休眠将起作用。 2.1 不会休眠。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 2014-11-02
      相关资源
      最近更新 更多