Если версия JPA 1.0 стала революцией по сравнению со своим предком Entity CMP 2.
• Генерирование схем — JPA 2.1 включает механизм генерирования стандартизированных схем баз данных, привнося новый API-интерфейс и набор свойств (которые определяются в файле persistence.xml).
• Преобразователи — новые классы, которые обеспечивают преобразование между представлениями баз данных и атрибутов.
• Поддержка CDI — теперь можно внедрять зависимости в слушатели событий.
• Поддержка хранимых процедур — JPA 2.1 позволяет выполнять динамически генерируемые и именованные запросы к хранимым процедурам.
• Запросы с использованием критериев на пакетное обновление и удаление — Criteria API позволял выполнять только запросы на выборку; теперь стали возможны запросы на обновление и удаление.
• Понижающее приведение — новый оператор TREAT обеспечивает доступ к специфичному для подклассов состоянию в запросах.
В табл. 4.1 приведены основные пакеты, определенные в JPA 2.1 на сегодняшний день.
Пакет | Описание |
---|---|
javax.persistence | API-интерфейс для управления постоянством и объектно-реляционным отображением |
javax.persistence.criteria | Java Persistence Criteria API |
javax.persistence.metamode | Java Persistence Metamodel API |
javax.persistence.spi | SPI для поставщиков Java Persistence |
Эталонная реализация
EclipseLink 2.5 представляет собой эталонную реализацию JPA 2.1, имеющую открытый исходный код. Она обеспечивает мощный и гибкий фреймворк для сохранения Java-объектов в реляционных базах данных. EclipseLink является реализацией JPA, однако также поддерживает XML-постоянство с помощью Java XML Binding (JAXB) и других средств вроде Service Data Objects (SDO). EclipseLink предусматривает поддержку не только объектно-реляционного отображения, но и технологии Object XML Mapping (OXM), постоянства объектов в информационных системах предприятий (Enterprise Information System — EIS) c использованием Java EE Connector Architecture (JCA) и веб-служб баз данных.
Истоки EclipseLink берут свое начало в продукте TopLink от компании Oracle, переданном организации Eclipse Foundation в 2006 году. EclipseLink является эталонной реализацией JPA и фреймворком постоянства, используемым в этой книге. Его также называют поставщиком постоянства, или просто поставщиком.
На момент написания этой книги EclipseLink был лишь реализацией JPA 2.1. Однако вскоре последуют Hibernate и OpenJPA и у вас будет несколько реализаций на выбор.
Все вместе
Теперь, когда вы немного познакомились с JPA, EclipseLink, сущностями, менеджером сущностей и JPQL, сведем их воедино и напишем небольшое приложение, которое будет обеспечивать постоянство сущности в базе данных. Идея заключается в том, чтобы написать простую сущность Book с ограничениями Bean Validation и класс Main, который позаботится о ее постоянстве. Затем вы проведете компиляцию соответствующего кода с помощью Maven и выполните его с использованием EclipseLink и клиентской базы данных Derby. Чтобы продемонстрировать, насколько легко провести интеграционное тестирование сущности, я покажу вам, как написать тестовый класс (BookIT) с применением JUnit 4 и задействовать встроенный режим Derby для обеспечения постоянства данных с использованием базы данных в оперативной памяти.
В этом примере мы будем придерживаться структуры каталогов Maven, в силу чего классы и файлы, показанные на рис. 4.4, должны будут располагаться в следующих каталогах:
• src/main/java — для сущности Book и класса Main;
• src/main/resources — для файла persistence.xml, которым будут пользоваться классы Main и BookIT, а также сценарий загрузки базы данных insert.sql;
• src/test/java — для класса BookIT, который будет применяться для интеграционного тестирования;
• pom.xml — для POM-модели Maven, которая описывает проект и его зависимости от других внешних модулей и компонентов.
Рис. 4.4. Все вместе
Написание сущности Book
Сущность Book, показанную в листинге 4.7, необходимо создать и разместить в каталоге src/main/java. У нее будет несколько атрибутов (title, price и т. д.) с разными типами данных (String, Float, Integer и Boolean), аннотации Bean Validation (@NotNull и @Size), а также аннотации JPA.
• @Entity проинформирует поставщика постоянства о том, что этот класс является сущностью и ему следует управлять им.
• Аннотации @NamedQueries и @NamedQuery будут определять два именованных запроса, которые станут использовать JPQL для извлечения информации о книгах из базы данных.
• @Id будет определять атрибут id как первичный ключ.