Комментарии Кевина Саттера: Новости по Java Persistence API 2.0

Поскольку группа JPA Expert Group (JSR-317) близка к завершению спецификации JPA 2.0, в данной статье рассказывается о некоторых новых концепциях и функциональных возможностях, определенных в этой обновленной спецификации. В ней также объясняется, как можно освоить эту новую функциональность, используя проект Apache OpenJPA - надежную, высокопроизводительную, масштабируемую реализацию спецификации JPA с открытыми исходными кодами. Из журнала IBM WebSphere Developer Technical Journal.

Кевин Саттер, ведущий инженер-программист, IBM

Кевин Саттер (Kevin Sutter) - ведущий инженер-программист группы разработки сервера приложений WebSphere. Он отвечает за разработку реализации Java Persistence API для WebSphere. Кевин также является членом комитета PMC в проекте Apache OpenJPA. Предыдущей задачей Кевина была разработка архитектуры и реализация J2EE Connector Architecture (JCA) и ObjectGrid (подсистемы кэширования) для WebSphere.



03.02.2012

Всегда есть место для улучшений и дополнений

Спецификация Java™ Persistence API (JPA) впервые была представлена в платформе Java Platform Enterprise Edition (Java EE) 5 как часть семейства спецификаций Enterprise JavaBean™ (EJB) 3.0. С тех пор JPA 1.0 получила признание и стала очень популярной средой персистентности. Несмотря на то, что эта первая спецификация была очень полной и функциональной, нет предела совершенству. В настоящее время группой JSR 317 разрабатывается следующая версия спецификации JPA (JPA 2.0).

Экспертная группа JPA активно работает над завершением спецификации JPA 2.0. Недавно был опубликован черновой вариант спецификации Public Final Draft #2, а выход окончательной версии спецификации JPA 2.0 планируется 16 ноября 2009г.

В одной рубрике Comment Line невозможно уделить одинаковое внимание всем новым возможностям спецификации JPA 2.0. В данной статье будет представлено краткое введение и информация, которая поможет вам узнать из первых рук об опыте использования этих возможностей в проекте Apache OpenJPA.


Персистентность

Как я уже упоминал, первая спецификация JPA была функционально завершенной. Многие из новых функциональных возможностей, представленных в JPA 2.0 (особенно в части объектно-реляционного связывания и моделирования доменов), предназначены для "крайних" случаев - сценариев, существующих в отрасли из-за устаревших приложений и схем, но не являющихся обычным, ежедневно применяемым типом сценариев. Другие основные новые функциональные возможности (например, Criteria API и интеграция с интегрированной средой Bean Validation) просто пополняют арсенал JPA возможностями персистенции.

Итак, давайте ближе рассмотрим каждую из них:

  • объектно-реляционное связывание и моделирование доменов
    • Несколько новых добавлений в JPA 2.0 связаны с объектно-реляционным связыванием и моделированием доменов. Определение и использование embeddable (встраиваемая сущность) расширено и включает теперь collections of embeddables (коллекции встраиваемых сущностей), nested embeddables (структурированные встраиваемые сущности) и встраиваемые сущности, содержащие взаимосвязи с другими сущностями. Естественно, язык Java Persistence Query Language (JPQL) также обновлен для поддержки этих нововведений.
    • Тип Access (@Access) тоже был расширен в JPA 2.0 и теперь допускает специфицирование по персистентным типам или даже по индивидуальным атрибутам. Эти изменения обеспечивают большую гибкость при проектировании определений сущностей и ассоциированных приложений, использующих эти сущности.
    • JPA 2.0 предоставляет расширенную поддержку связываний (map) для ElementCollections в дополнение к существующим взаимоотношениям OneToMany, ManyToOne и ManyToMany. Этой расширенной поддержке коллекций связываний соответствуют аннотации для MapKeyColumn, MapKeyClass и MapKeyJoinColumn. JPQL также обновлен для поддержки этих новых конструкций.
    • Еще одной новой функциональностью JPA 2.0, связанной с моделированием доменов, является определение унаследованных идентичностей (derived identities). Эта функциональность позволяет наследовать идентификатор сущности из другой сущности, что реализует взаимоотношения предок-потомок (parent-to-dependent). В спецификации JPA 2.0 сценариям использования унаследованных идентичностей посвящено несколько страниц (раздел 2.4).
  • Система времени исполнения JPA

    Переход к JPA 2.0 требует обновления всех важнейших API JPA: EntityManagerFactory, EntityManager и Query. К счастью, все эти обновления сделаны совместимыми снизу вверх, что позволяет гладко выполнять миграцию как с точки зрения приложения, так и с точки зрения JPA-провайдера. Многие обновления этих API связаны с получением доступа к ключевым новым функциональным возможностям JPA 2.0, таким как Metamodel и Criteria API (более подробно о них позже), но стоит упомянуть о ряде других возможностей системы времени исполнения:

    • Одной из новых функциональных возможностей JPA 2.0 является появление пессимистичного менеджера блокировок (pessimistic LockManager). В JPA 1.0 была определена семантика только оптимистичной блокировки, но реальные приложения корпоративного уровня время от времени требуют наличия возможности применять более строгую пессимистичную блокировку. Применение семантики пессимистичной блокировки может быть указано посредством LockModeType в конкретных методах EntityManager или Query. (В Apache OpenJPA еще раньше было определено свойство openjpa.LockManager и рекомендация ReadLockMode, которые можно использовать для дальнейшей настройки семантики пессимистичной блокировки в рамках OpenJPA.)
    • Еще одно обновление системы времени исполнения JPA 2.0 обеспечивает доступ к кэшу второго уровня провайдера JPA, если кэш доступен. JPA 2.0 все еще не требует, чтобы провайдер JPA действительно предоставлял кэш 2-го уровня. Спецификация также не определяет способ подключения или использования кэша 2-го уровня. Но если кэш доступен, этот новый API и ассоциированные аннотации помогут управлять содержимым кэша 2-го уровня. (Кстати, Apache OpenJPA предоставляет плагин кэша 2-го уровня; кроме того, доступны реализации кэша от сторонних производителей.)
  • API-интерфейсы Metamodel и Criteria

    Одной из функциональных возможностей, породившей основную часть разговоров вокруг JPA 2.0, является комбинация API Metamodel и Criteria. API Criteria позволяет программно конструировать запросы, используя объектный граф запросов. API Criteria является динамической альтернативой JPQL: вместо создания и управления JPQL-запросами с использованием строковых классов и методов теперь можно применять API Criteria для программного создания и управления запросами.

    Но что действительно делает API Criteria очень мощным - это безопасность типов API. Безопасность типов (type-safety) обеспечивает значительно более раннее обнаружение ошибок - во время компиляции, а не во время исполнения, как при использовании стандартных JPQL-конструкций. Основой этой безопасности типов являются API и интерфейсы Metamodel. API Metamodel может использоваться для динамического доступа к информации метамодели персистентного модуля. Эти конструкции метамодели могут генерироваться статически или динамически.

  • Проверка корректности bean-компонентов

    Поддержка проверки корректности bean-компонентов является еще одной ключевой функциональной возможностью JPA 2.0, которая распространяется как на управляемые контейнером, так и на управляемые приложением среды. Проверка корректности bean-компонентов может использоваться для реализации необязательной проверки корректности сущности, основанной на аннотациях и XML-ограничениях, группах проверки корректности (validation groups) и последовательностях групп (group sequences), определенных спецификацией JSR-303. Существующие события жизненного цикла JPA для PrePersist, PreUpdate и PreRemove предоставляют точки перехвата (hook points) в интегрированной среде проверки корректности bean-компонентов. Провайдер JPA также отвечает за предоставление TraversableResolver, чтобы гарантировать соблюдение планов выборки для атрибутов и взаимоотношений сущностей для управляемых объектов.


Apache OpenJPA

Как освоить новые мощные функциональные возможности JPA 2.0? Одним из результатов работы над спецификацией JPA 2.0 является проект с открытыми исходными кодами Apache OpenJPA, который предоставляет основу для JPA-решений WebSphere Application Server.

Как видно из плана работ по OpenJPA 2.0, разработка находится в активном состоянии с декабря 2008 года. Было описано и выпущено несколько итераций и промежуточных версий. Если вы хотите иметь все самое последнее и новое, доступны также ночные сборки драйверов. Эти ночные сборки 2.0 полностью прошли регрессионное тестирование, поэтому вы можете быть полностью уверены в их стабильности. Для тех, кто хочет еще большей уверенности, выпускаются также Milestone-драйверы. Самый новый Milestone-драйвер основан на версии Early Access спецификации JPA 2.0. После опубликования JPA 2.0 Proposed Final Draft #2 будет выпущен другой Milestone-драйвер. Следите за домашней страницей OpenJPA или страницей News, на которых эти обновления будут доступны.

Что можно делать с начальными драйверами OpenJPA 2.0

Все, что задокументировано в Apache OpenJPA Roadmap, применимо для разработки. С каждой интеграцией новой функции интегрируются также соответствующие JUnit-тесты и обновления документации. Будем надеяться, что спецификация, реализация OpenJPA, варианты использования и документация предоставят достаточно информации, чтобы освоить эту новую функциональность JPA 2.0.

Если вы следите за работой экспертной группы JPA 2.0, вам известно, что она находится в постоянном движении. Экспертная группа JPA продолжает изменять спецификацию и связанный с ней API еженедельно, хотя скорость изменений значительно снижается по мере приближения к окончательной версии. Конечно же, из-за этих практически постоянных изменений нужно помнить, что реализация OpenJPA может быть не полностью синхронизирована с деятельностью экспертной группы, и до выхода окончательной спецификации возможны отличия.

Если вы экспериментируете с новой функциональностью JPA 2.0, сообщество OpenJPA было бы радо услышать ваши комментарии. Вы обнаружили потенциальные ошибки или неверную интерпретацию спецификации, имеете другие отзывы о драйверах? Было бы хорошо и полезно увидеть ваши замечания в наших списках рассылки для пользователей (User) или для разработчиков (Dev). Естественно, если вы находите явные ошибки, без всяких сомнений создавайте JIRA Issues. Мы хотим, чтобы эта версия OpenJPA 2.0 была как можно более полной, поэтому ранние отзывы пользователей желательны и поощряются.


Производительность и поддержка баз данных

Производительность всегда является проблемой, особенно когда в стабильную систему времени исполнения, такую как OpenJPA 1.2.x, добавляется так много новых функциональных возможностей. Не сомневайтесь в том, что мы постоянно отслеживаем аспекты производительности этих новых функциональных возможностей и то, как они влияют на существующую функциональность JPA 1.0. Мы не только не хотим какого-либо ухудшения производительности, но одной из наших целей является улучшение производительности существующего кода. Естественно, мы также измеряем и отслеживаем производительность новых функциональных возможностей.

Мы также заинтересованы в постоянном улучшении и расширении поддержки баз данных. Естественно, с точки зрения IBM мы стремимся обеспечить наилучшую поддержку IBM DB2®, Informix®, Derby и даже solidDB®. OpenJPA обеспечивает также поддержку Oracle и Microsoft® SQL Server. Некоторые последние нововведения также улучшили поддержку PostgreSQL и MySQL. Весь спектр поддержки баз данных описывается в документации OpenJPA. Мы постоянно проводим полное тестирование поддержки в OpenJPA 2.0 основных баз данных, чтобы гарантировать корректную работу со всеми новыми функциональными возможностями.


Резюме

Мы надеемся, что эта статья пробудила у вас интерес к JPA 2.0 и к реализации Apache OpenJPA 2.0. Работы над JPA 2.0 не прекращаются, но выпуск окончательной версии спецификации назначен на ноябрь, а полностью совместимая версия OpenJPA 2.0 должна появиться вскоре после этого.

Ресурсы

Научиться

Получить продукты и технологии

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=WebSphere, Технология Java
ArticleID=791406
ArticleTitle=Комментарии Кевина Саттера: Новости по Java Persistence API 2.0
publish-date=02032012