persistence-unit
Download
Report
Transcript 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