【问题标题】:Liberty: How to change default JPA provider?Liberty:如何更改默认 JPA 提供程序?
【发布时间】:2014-01-29 10:11:47
【问题描述】:

为了针对 JPA 2.1 API 进行编程,我想使用 eclipseLink,而不是默认的 OpenJPA JPA 提供程序。如何在 WAS 8.5 Liberty 配置文件中实现这一点?

我尝试不使用 jpa-2.0 功能并设置我的 webapp 引用的共享库,但没有成功。

这是我的 server.xml:

<server description="new server">

<!-- Enable features -->
<featureManager>
    <feature>jsp-2.2</feature>
    <feature>localConnector-1.0</feature>
</featureManager>

<httpEndpoint host="localhost" httpPort="9080" httpsPort="9443"
    id="defaultHttpEndpoint" />

<applicationMonitor updateTrigger="mbean" />

<webApplication id="System" location="System.war" name="System">
    <classloader commonLibraryRef="mysql" />
    <classloader commonLibraryRef="eclipseLink" />
</webApplication>

<library id="mysql" name="mysql-jdbc-driver">
    <fileset dir="C:\Users\jacomac\.m2\repository\mysql\mysql-connector-java\5.1.26" includes="*.jar"/>
</library>

<library id="eclipseLink" name="eclipse-jpa-impl">
    <fileset dir="C:\Users\jacomac\.m2\repository\org\eclipse\persistence\eclipselink\2.5.2-M1" includes="*.jar"/>
    <fileset dir="C:\Users\jacomac\.m2\repository\org\eclipse\persistence\javax.persistence\2.1.0" includes="*.jar"/>
    <fileset dir="C:\Users\jacomac\.m2\repository\org\eclipse\persistence\commonj.sdo\2.1.1" includes="*.jar"/>
</library>
</server>

这是我得到的错误:

java.lang.NoClassDefFoundError: javax/persistence/Persistence

补充:我知道如果我在我的 web 应用程序中提供 eclipseLink 库,它会起作用,但我想将它用作跨多个 web 应用程序的共享资源。

【问题讨论】:

    标签: websphere-liberty


    【解决方案1】:

    即使 EclipseLink 支持 JPA 2.1,Liberty 8.5.5.x 似乎也只支持 JPA 2.0。

    要让 Liberty 使用 EclipseLink,在共享库中,您需要设置“parentLast”类加载器。我的示例使用耳朵,但您也可以为战争设置类加载器。

    您应该只包含 eclipselink.jar 并让 Liberty 使用它自己的 javax.persistence 实现。

    server.xml:

    <fileset dir="${shared.resource.dir}/EclipseLinkLibs" id="EclipseLinkFileset" includes="eclipselink.jar"/>
    <library filesetRef="EclipseLinkFileset" id="EclipseLinkLib"/>
    <enterpriseApplication id="myEAR" location="myEAR.ear" name="myEAR">
        <classloader delegation="parentLast" commonLibraryRef="EclipseLinkLib"/>
    </enterpriseApplication>
    

    您还需要在persistence.xml中将EclipseLink设置为提供者:

    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    

    根据您的 EclipseLink 版本和 JTA 的使用,您可能还必须考虑此错误并使用建议的解决方法: WebSphereTransactionController does not handle JTA on WebSphere 8.5

    【讨论】:

      【解决方案2】:

      从 WebSphere Liberty 8.5.5.6 开始,引入了 EE7 支持,其中包括 JPA 2.1 支持。借助 JPA 2.1 功能 (jpa-2.1),我们将默认 JPA Provider 更改为 Eclipselink 2.6。

      OpenJPA 仍然可用,并且是默认的 JPA 提供程序,具有 jpa-2.0 特性,它本身与其他 EE7 特性向前兼容,以支持那些不想将其启用 JPA 的应用程序从 OpenJPA 移出的用户和不需要利用 JPA 2.1 添加的功能。

      请记住,一次只能启用一项 JPA 功能,因此将 jpa-2.0 与 EE7 功能一起使用需要启用单独的功能,而不是使用 EE7 便利功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        相关资源
        最近更新 更多