Глава 2. Архитектура

2.1. Обзор

Высокоуровневое (очень высокоуровневое) представлений архитектуры Hibernate:

Эта схема демонстрирует, что Hibernate использует базу данных (Database) и конфигурационные данные (hiberanate.properties, XML mapping) для предоставления сервисов, делающих объекты долгоживущими (Pesistent Objects), данные сервисы используются приложением (Application).

Нам бы хотелось показать более детальное представление архитектуры времени выполения (runtime architecture). Т.к. Hibernate очень гибкий инструмент и поддерживает несколько вариантов архитектуры времени выполения, мы продемонстрируем два наиболее крайних. "Облегченную" архитектуру имеют приложения предоставляющие Hibernate свои собственные JDBC-соединения и сами управляющие транзакциями. Данный вариант использует минимальное подмножество Hibernate API:

Архитектура "всё в шоколаде" ("full cream") абстрагирует приложение от нижележащих JDBC/JTA API и даёт возможность Hibernate самому заботиться обо всех деталях.

Вот несколько определений объектов изображенных на схемах:

SessionFactory (net.sf.hibernate.SessionFactory)

Потокобезопасный, неизменяемый (threadsafe, immutable) кэш откомпилированных мэппингов для одной базы данных. Фабрика для создания объектов класса Session (Hibernate сессий). SessionFactory является клиентом для ConnectionProvider. SessionFactory может поддерживать опциональный кэш для данных, которые используются несколькими транзакциями, этот кэш называют кэш второго уровня (second-level cache) или кэш уровня JVM (JVM-level cache). Данный кэш можно настроить таким образом чтобы он работал как для одного процесса (process-level) так и для нескольких процессов в кластере (cluster-level).

Session (net.sf.hibernate.Session)

Однопоточный, короткоживущий объект, являющийся посредником между приложением и хранилещем долгоживущих объектов. Обертка вокруг JDBC-соединения. Фабрика для объектов класса Transaction. Содержит обязательный кэш первого уровня (first-level cache) для долгоживущих объектов, используется для навигирования по объектному графу или для поиска объектов по идентификатору.

Persistent Objects and Collections

Долгоживущие Объекты и Коллекции. Однопоточные, короткоживущие объекты содержащие сохраняемое состояние и бизнес функции. Это могут быть обычные JavaBean/POJO объекты, одна их отличительная особенность, это то, что они ассоцированны с одной сессией (Session). Как только их сессия закрыта, эти объекты становятся отсоединенными (detached) и свободными для использования на любом слое/уровне (layer) приложения, например непосредсвенно как объекты передачи данных (data transfer objects) на уровень представления и с него.

Transient Objects and Collections

Временные Объекты и Коллекции. Экземляры долгоживущих (persistent) классов, которые в данный момент не ассоцированы с сессией (Session). Это могут быть объекты инстанциированые приложением и в данный момент еще не переведенные в долгоживущее (persistent) состояние или они могли быть инстациированы закрытой сессией (TODO как это???).

Transaction (net.sf.hibernate.Transaction)

Транзакция. Опциональный однопоточный, короткоживущий объект, используется приложением для указания атомарной единицы выполняемой работы (atomic unit of work). Абстагирует приложение от нижелещащих JDBC, JTA или CORBA транзакций. В некоторых случаях одна сессия (Session) может породить несколько транзакций.

ConnectionProvider (net.sf.hibernate.connection.ConnectionProvider)

Поставщик соединений. Опциональная фабрика и пул для JDBC-соединений. Абстрагирует приложение от нижелещащих объектов Datasource или DriverManager. Это внутренний объект Hibernate, он недоступен для приложения, но может быть расширен/реализован разработчиком.

TransactionFactory (net.sf.hibernate.TransactionFactory)

Фабрика транзакций. Опциональная фабрика для экземпляров класса Transaction. Это внутренний объект Hibernate, он недоступен для приложения, но может быть расширен/реализован разработчиком.

В изображенной выше "облегченной" архитектуре, приложение не использует следующих API Hibernate: Transaction/TransactionFactory, ConnectionProvider API и взаимодействует с JTA или JDBC напрямую.

2.2. Интеграция с JMX

JMX -- это J2EE-стандарт для управления Java-компонентами. Hibernate может быть управляемым посредством стандартного JMX MBean, но т.к. большинство серверов приложений еще не поддерживает JMX, то в Hibernate используются некоторые нестандартные механизмы конфигурации.

Пожалуйста, обратитесь к web-сайту за более детальной информацией о том как настроить Hibernate для работы как JMX-компонент внутри JBoss.

2.3. Поддержка JCA

Hibernate также может быть сконфигурирован для работы как JCA-коннектор (JCA connector). Пожалуйста, обратитесь к web-сайту за более детальной информацией.