Пример рабочего макета 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's 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 .