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