Совместное использование единицы персистентности по компонентам в формате .ear
В приложении Java EE 6, где я использую .ear-упаковку, я хотел бы создать блок персистентности, доступ к которому можно получить из компонентов в разных файлах .jar.
Тем не менее, я не уверен, как определить этот блок персистентности. В аннотации @PersistenceContext поиск выполняется только в том случае, если имя совпадает с единицей сохранения, определенной в локальном файле persistence.xml.
Можно ли ссылаться на внешние единицы сохранения?
Ответы
Ответ 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
- Для каждого файла 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
Удачи!