2014-01-29 2 views
1

Чтобы запрограммировать API JPA 2.1, я бы хотел использовать eclipseLink, а не поставщик OpenJPA JPA по умолчанию. Как это можно достичь в профиле WAS 8.5 Liberty?Liberty: Как изменить поставщика JPA по умолчанию?

Я пробовал не использовать функцию 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 

Добавка: Я знаю, что это работает, если я поставляю библиотеки EclipseLink в моем веб-приложение, но я хотел бы использовать его как общий ресурс для нескольких веб-приложений.

ответ

1

Liberty 8.5.5.x только поддерживает JPA 2.0, даже если EclipseLink поддерживает JPA 2.1.

Чтобы использовать 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> 

Кроме того, необходимо установить EclipseLink в качестве поставщика в persistence.xml:

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

В зависимости от версии EclipseLink и использования JTA вы можете также должны рассмотрите эту ошибку и используйте предлагаемое решение: WebSphereTransactionController does not handle JTA on WebSphere 8.5

1

Начиная с версии WebSphere Liberty 8.5.5.6 была введена поддержка EE7, который включает поддержку JPA 2.1. Благодаря функции JPA 2.1 (jpa-2.1) мы изменили поставщика JPA по умолчанию на Eclipselink 2.6.

OpenJPA по-прежнему доступен и является поставщиком JPA по умолчанию с функцией jpa-2.0, которая сама по себе совместима с другими функциями EE7, чтобы поддерживать тех, кто не хочет перемещать свои приложения с поддержкой JPA с OpenJPA и не нужно использовать возможности, добавленные JPA 2.1.

Помните, что только одна функция JPA может быть включена за один раз, поэтому использование jpa-2.0 с функциями EE7 требует включения отдельных функций, а не использования удобной функции EE7.

Смежные вопросы