Подтвердить что ты не робот

Совместное использование единицы персистентности по компонентам в формате .ear

В приложении Java EE 6, где я использую .ear-упаковку, я хотел бы создать блок персистентности, доступ к которому можно получить из компонентов в разных файлах .jar.

Тем не менее, я не уверен, как определить этот блок персистентности. В аннотации @PersistenceContext поиск выполняется только в том случае, если имя совпадает с единицей сохранения, определенной в локальном файле persistence.xml.

Можно ли ссылаться на внешние единицы сохранения?

4b9b3361

Ответ 1

Вот соответствующие разделы спецификации JPA 2.0:

8.2 Упаковка единицы измерения настойчивости

...

Единица персистентности определяется persistence.xml. Файл jar или каталог, каталог META-INFсодержит файл persistence.xmlназываемый корнем персистентности Блок. В средах Java EE корень единицы персистентности должен быть одним из следующего:

  • файл EJB-JAR
  • каталог WEB-INF/classes файла WAR [80]
  • файл jar в каталоге WEB-INF/lib файла WAR
  • файл jar в каталоге библиотеки EAR
  • файл клиента jar приложения

Не требуется, чтобы EJB-JAR или WAR файл, содержащий блок персистентности быть упакованы в EAR, если единица персистентности содержит постоянство классов в дополнение к содержащимся в EJB-JAR или WAR. См. Раздел 8.2.1.6.

ПРИМЕЧАНИЕ. Java Persistence 1.0 поддерживает использование файла jar в корне EAR как корень единицы сохранения. Это использование больше не поддерживается. Портативные приложения должны использовать каталог библиотеки EAR для этого случая вместо. См. [9].

У единицы продолжительности должно быть имя. Только одна единица персистентности любого данного имя должно быть определено в пределах одного Файл EJB-JAR в рамках одной WAR файл в одном приложении клиентская банка или внутри EAR. Видеть Раздел 8.2.2, "Единица сохранения Область применения".

Можно использовать файл persistence.xmlдля обозначения более чем одного персистентности единица в той же области.

Все классы персистентности, определенные на уровень Java EE EAR должен быть доступный для всех других Java EE компоненты в приложении - т.е. загружается загрузчиком классов приложений - такой, что если к одному и тому же сущностному классу относятся два разных Java EE компоненты (которые могут использоваться разные единицы персистентности), ссылочный класс - это то же самое класс.

И позже:

8.2.2 Сфера сохранения единицы измерения

Клиент EJB-JAR, WAR, приложение jar или EAR может определять постоянство Блок.

При ссылке на блок персистентности используя аннотацию unitNameэлемент или persistence-unit-nameдескриптор развертывания, область видимости настойчивости единица определяется ее точкой определение:

  • Единица сохранения, которая определена на уровне EJB-JAR, WAR или банку клиента приложения что EJB-JAR, WAR или приложение jar соответственно и видны компоненты, определенные в этой банке или войне.
  • Единица сохранения, которая определена на уровне EAR, обычно видимый всем компонентам приложение. Однако , если сохранение единица с тем же именем определяется EJB-JAR, WAR или файл приложения jar в пределах EAR - единица сохранения этого имени, определенного на уровне EAR, будет не видны компонентам определяемый этим EJB-JAR, WAR или файл приложения, если ссылка на постоянство использует название единицы сохранения #. указать имя пути для устранения неоднозначности ссылка. Когда синтаксис #используется имя пути по отношению к ссылка на приложение файл. Например, синтаксис ../lib/persistenceUnitRoot.jar#myPersistenceUnitотносится к единице имя, указанное в элементе name файла persistence.xml, является myPersistenceUnit и для которого относительное имя пути корня единица персистентности ../lib/persistenceUnitRoot.jar. Синтаксис # может использоваться как с элементом аннотации unitName, так и с persistence-unit-name развертывание дескриптор для ссылки на единица настойчивости, определенная на уровне EAR.

Также вам нужно включить jar-классы сущностей в манифест pu jar http://wiki.eclipse.org/Packaging_and_Deploying_EclipseLink_JPA_Applications_(ELUG)

Подводя итог, вы должны иметь возможность определять свои сущности и блок персистентности на верхнем уровне EAR и использовать их из других модулей.

Я просто не уверен, что понял, что вы пробовали, и с какими проблемами вы столкнулись.

Ответ 2

Проблема может быть решена путем размещения persistence.xml в файле jar, который находится в каталоге уха lib.

Файл persistence.xml должен содержать файлы jar, которые включают Entities. Я должен был дать относительный путь к файлам jar. Моя структура справочника уха

|-ear--
       |-lib--|... some libs ...
       |      |--my-persistence-xml.jar
       |-ejb-with-entities1.jar
       |-ejb-with-entities2.jar

My persistence.xml для jboss 7.1.1

<persistence-unit name="my-pu" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/mypu</jta-data-source>
    <jar-file>../ejb-with-entities1.jar</jar-file>
    <jar-file>../ejb-with-entities1.jar</jar-file>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true" />
    </properties>
 </persistence-unit>

Надеюсь, что это поможет

Ответ 3

Все, что вам нужно

EAR +
    |- META-INF +
    |       - persistence.xml
    |- ejb1-module.jar
    |- ejb2-module.jar


<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="my-persistence-unit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>MyDataSource</jta-data-source>
        <!-- Note: it relative to `persistence-module.jar` file location in EAR -->
        <jar-file>../ejb1-module.jar</jar-file>
        <jar-file>../ejb2-module.jar</jar-file>
        <properties>
            ...

        </properties>
    </persistence-unit>
</persistence>

Ответ 4

Пример рабочей схемы EAR для Glassfish:

EAR +
    |- lib +
    |      |- core-module.jar
    |      \- persistence-module.jar +
    |                                 \- META-INF +
    |                                              \- persistence.xml
    |- ejb1-module.jar
    \- ejb2-module.jar

Модули EJB могут быть либо архивами jar, либо взорванными каталогами.

В этом случае ваш persistence.xml может выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="my-persistence-unit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>MyDataSource</jta-data-source>
        <!-- Note: it relative to `persistence-module.jar` file location in EAR -->
        <jar-file>../ejb1-module.jar</jar-file>
        <jar-file>../ejb2-module.jar</jar-file>
        <properties>
            <property name="hibernate.current_session_context_class" value="jta"/>
            <property name="hibernate.id.new_generator_mappings" value="true"/>
            <property name="hibernate.dialect"      value="org.hibernate.dialect.PostgreSQL82Dialect"/>
            <property name="hibernate.show_sql"     value="true"/>
            <property name="hibernate.format_sql"   value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

Вам нужно обновить ссылки <jar-file>, если вы используете обновление версии модуля (например, ejb1-module-1.0-SNAPSHOT.jar).

Абстрактные объекты с аннотацией @MappedSuperclass и EntityManager могут быть помещены в любую внешнюю банку. Эта банка не требует упоминания в persistence.xml. Например, вы можете создать core-module.jar с помощью PersistableEntity.java:

public class PersistableEntity {
    @Id
    @GeneratedValue
    private Long id;

    public Long getId() { return id; }

    public Integer getVersion() { return version; }
}

И PersistableEntityManager.java:

public class PersistableEntityManager<T extends PersistableEntity> {
    @PersistenceContext
    protected EntityManager em;
}

Этот core-module.jar может использоваться всеми вашими проектами с разными единицами сохранения. Вы просто наследуете свои сущности и EJB и избегаете шаблонов. Пример bilionix-core на github.

Ответ 5

Попробуйте следующее:

  • Настройте файл EAR application.xml следующим образом:

    http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd "  версия =" 7" >   YourEEApplication

    <initialize-in-order>true</initialize-in-order> <!-- This is the most important thing -->
    
    <module>
        <ejb>YourEJBModule1.jar</ejb>
    </module>
    <module>
        <ejb>YourEJBModule2.jar</ejb>
    </module>
    ......
    <module>
        <ejb>YourEJBModuleX.jar</ejb>
    </module>
    
    <module>
        <web>
            <web-uri>YourWebModule.war</web-uri>
            <context-root>YourWebModule</context-root>
        </web>
    </module>
    

  • В ваших проектах EJB YourEJBModule1, YourEJBModule2... и YourEJBModuleX:

Инъекционный контекст сохранения без свойства unitName:

@PersistenceContext(type=PersistenceContextType.TRANSACTION)
    private EntityManager em; // get & set
  1. Для каждого файла EJB файл persistence.xml:

YourEJBModule1:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="PersistenceUnit1"
        transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <jta-data-source>jdbc/YourDataSource</jta-data-source>
        <class>com.example.Foo1</class>
        <!-- Other properties -->
    </persistence-unit>
</persistence>

YourEJBModule2:

<?xml version="1.0" encoding="UTF-8"?>
...
    <persistence-unit name="PersistenceUnit2"
        transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <jta-data-source>jdbc/YourDataSource</jta-data-source>
        <jar-file>YourEJBModule1.jar</jar-file>
        <class>com.example.Foo2</class>
        <!-- Other properties -->
    </persistence-unit>
...

YourEJBModuleX:

<?xml version="1.0" encoding="UTF-8"?>
...
    <persistence-unit name="PersistenceUnitX"
        transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <jta-data-source>jdbc/YourDataSource</jta-data-source>
        <jar-file>YourEJBModule1.jar</jar-file>
        <jar-file>YourEJBModule2.jar</jar-file>
        ......
        <class>com.example.FooX</class>
        <!-- Other properties -->
    </persistence-unit>
...

В базе данных могут существовать различные схемы, по одному на EJB-модуль, доступ к ним через jta-data-source

(Развернутый в Glassfish 4)

Ответ 6

Вот что я сделал.

1) Пакет файлов конфигурации сохранения в файле jar. Файл jar будет содержать:

  • META-INF/persistence.xml(и orm.xml, если вы его используете)
  • Создайте папку "lib" в проекте EAR и вставьте туда банку.

2) Составьте связанные классы сущностей в другой банке:

  • Поместите этот файл jar в вашу папку GlassFish domain/lib (или любую другую папку lib на других серверах).
  • Я изначально связал банку в папке "lib" EAR, но классы не были найдены
  • Если кто-то знает лучший способ справиться с этим, объясните

Контекст сохранения теперь должен быть доступен для всех EJB и веб-приложений, включенных в ваше Enterprise Application.

Ответ 7

Я хотел достичь совместного EJB-модуля без EAR-проекта.

Это возможно

  • перемещение всех объектов persistance для разделения проекта EJB (не перемещать persistance.xml в новый проект, нужны только классы
  • компиляция этого проекта EJB
  • отправка проекта на сервер GlassFish с помощью
scpAsSudo ~/NetbeansProjects/UnifyEntities/dist/UnifyEntities.jar [email protected]:/opt/glassfish3/domains/domain1/lib/ext

Удачи!