Продолжается подписка на наши издания! Вы не забыли подписаться?

ORM без контейнера

Автор: Richard Hightower
Источники: Developer
ArcMind Inc

Hibernate
Spring
Ближе к делу
ORM с помощью Hibernate
Настройка связей объектов
Запросы в Hibernate
Spring IOC и Hibernate
Управление транзакциями с помощью Spring
Ссылки:

Если вам кажется, что все нужные вам средства разработки уже созданы и разложены по полочкам, то вот еще несколько недавно появившихся. 
			В этой статье Rick Hightower на реальном примере показывает применение наиболее интересных новых корпоративных технологий.
 Hibernate – это ORM-инструмент (Object-Relation Mapping), а Spring – это AOP framework и IOC-контейнер.  

Если вы следите за разговорами разработчиков, вы, скорее всего, слышали об IOC (Inversion of Control) и AOP (аспектно-ориентированном программировании). Однако вы, как и многие разработчики, можете пока не понимать, как эти технологии вписываются в вашу работу. В этой статье я попробую это исправить, показав, как использовать Hibernate и Spring для создания транзакционного персистентного слоя в корпоративном приложении.

Hibernate – это популярный, легкий в использовании ORM-фреймворк с открытым кодом для платформы Java. Spring – это AOP framework и IOC-контейнер. Эти две технологии лежат в основе приложения, разрабатываемого в данной статье. Здесь будет использоваться Hibernate для отображения персистентных объектов на реляционную БД, и Spring, чтобы упростить использование Hibernate и обеспечить поддержку декларативных транзакций.

Hibernate

Hibernate – это полнофункциональная, открытая ORM-фреймворк для Java. Во многом Hibernate похож на EJB CMP/CMR (container-managed-persistence/container-managed-relationships) и JDO (Java Data Objects). В отличие от JDO, Hibernate в основном рассчитан на ORM для реляционных БД, и предоставляет больше возможностей, чем большинство коммерческих продуктов. Большинство EJB CMP CMR-решений использует кодогенерацию для реализации кода персистентности, а JDO использует модификацию байт-кода (bytecode decoration). Hibernate же, наоборот, использует рефлексию и генерирование байт-кода во время исполнения, делая это почти прозрачно для конечного пользователя (ранние реализации Hibernate использовали только рефлексию, что упрощает отладку, в текущих версиях эта возможность сохранена).

Hibernate позволяет моделировать наследование (несколькими способами), связи (один-к-одному, один-ко многим, включение и агрегирование) и композицию.

Hibernate содержит язык запросов Hibernate Query Language (HQL), похожий на JDO JDOQL и EJB EJB QL, причем больше на последний. Но Hibernate на этом не останавливается: он также позволяет выполнять прямые SQL-запросы и/или использовать объектные критерии для составления критериев во время исполнения. В примерах этой статьи используется только HQL.

В отличие от EJB CMP CMR и очень похоже на JDO, Hibernate может работать внутри или вне J2EE-контейнера, что хорошо для тех, кто работает с TDD (test driven development).

Spring

Когда знаток AOP Nicholas Lesiecki объяснял мне, что такое AOP, я ничего не понял. Точно то же я испытал, когда впервые рассматривал возможность применения IOC-контейнеров. Сама концептуальная основа этих технологий дает немалую пищу для размышлений, а мириады новых акронимов не облегчают дела – особенно учитывая, что многие из них являются вариациями давно используемых.

Как часто бывает, понять эти две технологии гораздо проще на практике, чем теоретически. Предприняв собственные изыскания в реализациях AOP и IOC-контейнеров (а именно, XWork, PicoContainer и Spring), я нашел, что эти технологии предоставляют мне нужную функциональность без добавления зависимости от различных фреймворков.

AOP позволяет разработчикам создавать неповеденческие (non-behavioral) отношения, иначе – пересекающиеся отношения, и вставлять их в код приложений. При использовании AOP общие службы – логирование, персистентность, транзакции и т.п – могут быть вынесены в аспекты и применяться к объектам без усложнения их объектной модели.

IOC позволяет создать контекст приложения, где можно конструировать объекты, а затем передавать их объектам, работающим с ними. Как следует из слова inversion, IOC похоже на JNDI, вывернутое наизнанку. Вместо использования клубка абстрактных фабрик, сервис-локаторов, синглтонов прямого создания объектов, каждый объект создается вместе с работающими с ним объектами.

Spring – это одновременно и AOP-фреймворк, и IOC-контейнер. Кажется, Грэди Буч сказал об объектах, что самое хорошее в них – это то, что их можно заменить, а самое хорошее в Spring – это то, что оно помогает их заменять. При использовании Spring вы просто вводите зависимости (взаимодействующие объекты) с помощью свойств и конфигурационных файлов JavaBeans. После этого достаточно просто при надобности заменить взаимодействующие объекты другими, имеющими похожий интерфейс.

Spring – хорошее вступление в IOC-контейнеры и AOP. На самом деле, вам не нужно знать AOP для понимания примеров этой статьи. Все, что нужно – это знать, что для декларативного добавления поддержки транзакций в пример приложения будет использоваться AOP, примерно так же, как при использовании технологии EJB.

Ближе к делу

В остальной части статьи все обсуждение будет производиться на основе работающего примера. Начнем с корпоративного приложения, для которого реализуется слой, обеспечивающий транзакции и персистентность. Этот слой, объектно-реляционная БД, включает знакомые абстракции User, User Group, Roles и ContactInfo.

"С полным содержанием данной статьи можно ознакомиться в печатной версии журнала"

Copyright © 1994-2016 ООО "К-Пресс"