persistence-unit

реклама
Packaging и Deployment
1
Конфигурация persistence units
 Persistence unit является главным блоком конфигурации
 PU определяет всю информацию, которую использует
persistence provider в ходе своей работы
 PU можно мыслить как конфигурацию
EntityManagerFactory
 persistence.xml может объявлять несколько persistence
unit данного приложения
 Каждый persistence unit определяется в xml элементе:
 persistence-unit
2
Имя persistence unit
 Каждый PU должен иметь имя, уникальное в пределах
своей единицы пакетирования
 Имя PU EmployeeService должно быть уникально в
emp_ejb.jar
 Следующая декларация является минимально допустимой
декларацией PU:
<persistence-unit name="EmployeeService"/>
3
Тип транзакции
 Фабрика Entity Manager будет конструировать EM того или иного
transaction type, в зависимости от параметра в PU
 Принимает значения:
 JTA (значение по умолчанию)
 RESOURCE_LOCAL
 Для JTA транзакции может быть указан data source:
<persistence-unit name="EmployeeService">
<jta-data-source>jdbc/extendedEm</jta-data-source>
 Для Resource Local транзакции могут быть указаны JDBC параметры:
<persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="toplink.jdbc.url"
value="jdbc:derb1y://localhost:1527/EmpServDB;create=true"/>
<property name="toplink.jdbc.user" value="APP"/>
<property name="toplink.jdbc.password" value="APP1"/>
4
Persistence Provider
 Java EE совместимый сервер распространяется с
собственной имплементацией спецификации JPA
 Sun Java EE RI представляет Java EE Glassfish сервер со
встроенной имплементацией JPA Toplink Essentials
 Альтернативно, можно подменить JPA провайдер:
<persistence-unit name="EmployeeService">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
</persistence-unit>
 Поставщик провайдера должен имплементировать
интерфейс javax.persistence.spi.PersistenceProvider
5
Data Source
 Определяет Data Source через его JNDI имя, который
будет использован провайдером для доступа к БД
 Если провайдер является имплементацией JPA по
умолчанию, указание Data Source опционально
 Некоторые провайдеры допускают использование
второго, не JTA Data Source для того, чтобы избежать
приостановки текущей JTA транзакции (enlist transaction)
при выполнении read-only в новой, не JTA транзакции:
<persistence-unit name="EmployeeService">
<jta-data-source>jdbc/EmployeeServiceDS</jta-data-source>
<non-jta-data-source>jdbc/NonTxEmployeeServiceDS</non-jta-data-source>
</persistence-unit>
6
Файлы Mapping
 Все рассмотренные мэпинги, named query и др. могут
быть определены в одном или нескольких mapping files
 XML данные могут переопределять (override) данные
аннотаций
 Элементами верхнего уровня mapping файла являются:
(см. спецификацию для выяснения подробных правил
использования)




package
schema
catalog
access
7
Файлы Mapping








sequence-generator
table-generator
named-query
named-native-query
sql-result-set-mapping
entity
mapped-superclass
embeddable
 Совет. Рассмотреть целесообразность утилизации tablegenerator и named-query в Вашем приложении
8
Файлы Mapping
 Возможность использование нескольких файлов может
быть использована по-разному, в зависимости от
архитектуры и пристрастий команды, например:
 Все артефакты PU в одном файле, мэпинги в другом
 Все named запросы в одном файле, мэпинги в другом
 Запросы к разным сущностям или логическому домену
в разных файлах
 Mapping файлы должны находиться в подкаталогах METAINF
<persistence-unit name="EmployeeService">
<mapping-file>META-INF/employee_service_queries.xml</mapping-file>
<mapping-file>META-INF/employee_service_entities.xml</mapping-file>
</persistence-unit>
9
Спецификация managed классов
 Типичное приложение имеет один JAR файл, содержащий
managed классы, хотя возможна работа с несколькими
JAR файлами
 Существует 4 способа указать месторасположение
managed классов:
 Локальные классы
 Классы в файлах мэпингов
 Явно перечисленные классы
 Дополнительные JAR файлы managed классов
10
Локальные классы
 По умолчанию, провайдер осуществит поиск классов,
аннотированных с помощью @Entity, @MappedSuperclass
или @Embeddable в JAR файле
 Простейший и рекомендуемый способ определения
managed классов
11
Классы в файлах мэпингов
 Классы, объявленные во всех файлах мэпинга с помощью
элементов entity, mapped-superclass или embeddable
 Соответствующие классы должны быть в classpath
12
Явно перечисленные классы
 Можно указать явно классы, являющиеся managed, с
помощью xml элемента class
 Локальные классы в любом случае будут добавлены к
общему списку, поэтому разумно использовать явное
перечисление:
 Когда классы определены в другом JAR файле
 Если мы хотим отключить автоматический поиск
локальных классов и указывать классы явно. Элемент
exclude-unlisted-classes должен быть указан в
persistence.xml
 Приложение работает в среде Java SE
<persistence-unit name=“EmployeeService”>
<class>examples.model.Employee</class>
13
Дополнительные JAR файлы managed классов
 Дополнительные managed классы, находящие в другом
JAR файле можно подключить с помощью элемента jar-file
 Этот JAR файл должен быть доступен под classpath
 Классы, объявленные в JAR файле будут считаться
локальными провайдером
emp.ear
emp-ejb.jar
META-INF/persistence.xml
employee/emp-classes.jar
examples/model/Employee.class
Тогда:
<persistence-unit name="EmployeeService">
<jar-file>employee/emp-classes.jar</jar-file>
</persistence-unit>
14
Указание свойств провадера
 Элемент properties позволяет указать набор свойств,
влияющих на поведение провадера
 Это делает непереносимым файл persistence.xml
 Провайдер игнорирует свойства, которые он не знает
<persistence-unit name="EmployeeService">
<properties>
<property name="toplink.logging.level" value="FINE"/>
<property name="toplink.cache.size.default" value="500"/>
</properties>
</persistence-unit>
15
Спецификация classpath
 Каждый JAR файл, на который ссылается файл
persistence.xml должен находиться под classpath
приложения. Добавить туда JAR файл можно несколькими
способами:
 Добавить JAR файл в Class-Path элемент файла METAINF/MANIFEST.MF:
Class-Path: employee/emp-classes.jar employee/classes
 Поместить JAR файл под library директорию EAR
файла. По умолчанию это директория lib. Ее можно
указать явно в файле application.xml:
<application ... >
...
<library-directory>myDir/jars</library-directory>
</application>
16
Интеграция JPA
с другими частями Java EE приложения. EJB JAR
 Существует логичная потребность использования JPA
Session бинами
 Поэтому сущности логично пакетировать в EJB JAR
 Хотя ejb-jar.xml яляется опциональным в EJB 3.0, файл
persistence.xml по прежнему обязателен в META-INF
 В файле persistence.xml обязательной является только
спрецификация persistence unit. Плюс определение списка
managed сущностей, если они находятся в другом JAR
17
Пример. Интеграция JPA с другими частями
Java EE приложения. EJB JAR
emp.ear
emp-ejb.jar
META-INF/persistence.xml
examples/ejb/EmployeeService.class
examples/ejb/EmployeeServiceBean.class
emp-classes.jar
META-INF/orm.xml
META-INF/emp-mappings.xml
examples/model/Employee.class
examples/model/Phone.class
examples/model/Address.class
examples/model/Department.class
examples/model/Project.class
persistence.xml:
<persistence-unit name="EmployeeService">
<jta-data-source>jdbc/EmployeeServiceDS</jta-data-source>
<mapping-file>META-INF/emp-mappings.xml</mapping-file>
<jar-file>emp-classes.jar</jar-file>
</persistence-unit>
18
Пакетирование сущностей в Web архив
 Несмотря на то, что связывание представление с DAO
является плохой практикой, помещать persistence unit в
Web приложение допустимо
 Корнем persistence unit будет являться директория WEBINF/classes/ а не корень JAR файла, как в случае EJB
 Файл persistence.xml должен помещаться в WEBINF/classes/META-INF
19
Пример. Пакетирование сущностей в Web архив
emp.ear
emp.war
WEB-INF/web.xml
WEB-INF/classes/META-INF/persistence.xml
WEB-INF/classes/META-INF/orm.xml
WEB-INF/classes/examples/web/EmployeeServlet.class
WEB-INF/classes/examples/model/Employee.class
WEB-INF/classes/examples/model/Phone.class
WEB-INF/classes/examples/model/Address.class
WEB-INF/classes/examples/model/Department.class
WEB-INF/classes/examples/model/Project.class
 Часть файла persistence.xml может иметь вид:
<mapping-file>mapping/emp-mapping.xml</mapping-file>
20
Persistence Archive
 Для того, чтобы использовать persistence unit из
нескольких Java EE приложений, необходимо
использовать persistence archive
 PA это простой JAR файл, содержащий файл
persistence.xml в META-INF
 PA JAR, помещенный в корень или application library EAR
файла, будет доступен всем модулям enterprise
приложения
emp.ear
emp-persistence.jar
META-INF/persistence.xml
META-INF/orm.xml
examples/model/Employee.class
examples/model/Phone.class
examples/model/Address.class
examples/model/Department.class
examples/model/Project.class
21
Видимость Persistence Unit
 Файл persistence.xml может содержать несколько
persistence units
 Если используется локальный способ определения
managed классов (и не указан exclude-unlisted-classes), то
одни и те же классы JAR файла будут managed во всех
persistence units
 Persistence units доступны в области видимости своего
определения
 Имена persistence units доступны в области видимости
своего определения
 Одно и то же имя PU может повторно использоваться
в разных EJB файлах, хотя рекомендуется присваивать
имена, глобальные во всем приложении
22
Конфигурация Java Persistence API вне
Java EE сервера
 Transaction type является RESOURCE_LOCAL.
JPA вне сервера не поддерживает JTA
 Нельзя использовать JNDI DataSource name. Можно
указать локальные JDBC параметры соединения:
<persistence-unit name="EmployeeService">
...
<properties>
<property name="toplink.jdbc.driver"
value="org.apache.derby.jdbc.ClientDriver"/>
<property name="toplink.jdbc.url"
value="jdbc:derby://localhost:1527/EmpServDB;create=true"/>
<property name="toplink.jdbc.user" value="APP"/>
<property name="toplink.jdbc.password" value="APP"/>
</properties>
</persistence-unit>
23
Конфигурация Java Persistence API вне
Java EE сервера
 В JavaSE EntityManagerFactory создается вручную
используя класс Persistence
 Класс Persistence найдет провайдера по умолчанию из
classpath
 Альтернативно провайдер может быть указан через
элемент persistence файла persistence.xml
 Managed сущности должны указываться явно, через
элемент class. Нет автоматического определения
сущностей
24
Определение свойств «на лету»
 Можно динамически переопределять свойства
провайдера, используя перегруженный метод
createEntityMangerFactory()
 Например, можно переопределять информацию
аутентификации
25
Скачать