- Hibernate для начинающих
- Глава 3. Конфигурирование
- 3.1. Программная конфигурация
- 3.2. Получение SessionFactory
- 3.3. Соединения JDBC
- 3.4. Необязательные свойства конфигурации
- Внимание
- Заметка
- 3.4.1. Диалекты SQL
- 3.4.2. Outer Join Fetching
- 3.4.3. Двоичные потоки (binary streams)
- 3.4.4. Кэш второго уровня и кэш запросов
- 3.4.5. Замена языка запроса
- 3.4.6. Статистика Hibernate
- 3.5. Логирование
- Важно
- 3.6. Имплементация NamingStrategy
- 3.7. Имплементация PersisterClassProvider
- 3.8. XML-файл конфигурации
- 3.9. Интеграция на сервер приложений Java EE
- 3.9.1. Конфигурация стратегии транзакций
- 3.9.2. JNDI-связанный SessionFactory
Hibernate для начинающих
Я сталкивался (да и не только я) с проблемой развертывания Hibernate и решил попробовать осветить данную тему. Hibernate — это популярный framework, цель которого связать ООП и реляционную базу данных. Работа с Hibernate сократит время разработки проекта в сравнении с обычным jdbc.
Для новичка программирования настройка framework часто вызывает затруднения. Помощь комьюнити с освещением базовых проблем поможет начинающим осваивать языки программирования быстрее. Статья предназначена только для начинающих в Java, которые впервые развертывают hibernate. Я развертывал hibernate на базе лицензионной IDEA.
Maven framework для автоматизации сборки проекта на основе POM, позволяющая подключать из интернета зависимости, не скачивая библиотеки в проект. POM (project object model) -декларативное описание проекта. Копируем название библиотек в xml формате с сайта mvnrepository.com.
Для начала создаёте структуру проекта maven:
Потом в pom.xml вставляем. Нам понадобятся две зависимости: hibernate-core и mysql-connector, но если вы хотите больше функционала — вы должны подключить больше зависимостей.
Существуют стандартные рекомендации подключать зависимости по отдельности, но я так не делаю.
И щелкаем на Import Changes Enable Auto-Import, автоматически импортируя изменения.
Подключаемся к базе данных, которая развернута на локальном компьютере, выбираем поставщика баз данных MySQL.
Вводим имя базы данных, имя пользователя и пароль. Протестируйте соединение.
Выбираем проект и через framework support просим у хибернейта создать за нас Entity файлы и классы с Getter и Setter.
Выбираем Generate Persistence Mapping через кладку Persistence, выбираем jenerate Persistance Mapping, а в появившемся окне прописываем схему базы данных, выбираем prefix и
sufix к автоматически сгенерированным названиям. Будут сгенерированы названия xml файлов и классов с аннотациями:
Раскидайте файлы в таком порядке: .xml-файлы должны находится в папке с ресурсами, а сущности в папке java.
Дописываем в hibernate.cfg username и password (звёзды поставил я, а так пишите обычным шрифтом).
Вот и все! Дальше через класс main запускаем проект.
Это моя первая статья. Рассчитываю на здравую критику.
Источник
Глава 3. Конфигурирование
Hibernate предназначен для работы во многих различных средах, поэтому для него существует широкий диапазон параметров конфигурации. Большинство из них имеют разумные значения по умолчанию, а Hibernate распространяется с примером файла hibernate.properties в etc/ , который отображает различные параметры. Просто подставьте пример файла в свой classpath и настройте его в соответствии с вашими потребностями.
3.1. Программная конфигурация
Экземпляр org.hibernate.cfg.Configuration представляет собой полный набор отображений типов Java приложения для базы данных SQL. Конфигурация org.hibernate.cfg.Configuration используется для создания неизменяемого org.hibernate.SessionFactory . Отображения компилируются из различных XML-файлов.
Вы можете получить экземпляр org.hibernate.cfg.Configuration , создав его непосредственно и указав XML-файлы отображений. Если файлы отображений находятся в classpath, используйте addResource() . Например:
Альтернативный способ — указать отображаемый класс и позволить Hibernate найти XML-файлы отображений:
Затем Hibernate будет искать файлы отображаемый с именами /org/hibernate/auction/Item.hbm.xml и /org/hibernate/auction/Bid.hbm.xml в classpath. Такой подход исключает любые жестко заданные имена файлов.
org.hibernate.cfg.Configuration также позволяет указать свойства конфигурации. Например:
Это не единственный способ передать свойства конфигурации в Hibernate. Некоторые альтернативные варианты включают:
- Передачу экземпляра java.util.Properties в Configuration.setProperties() .
- Размещение файла с именем hibernate.properties в корне classpath.
- Установка System -свойств с использование java -Dproperty=value .
- Включение элементов
в файл hibernate.cfg.xml (обсуждается ниже).
Самый простой способ из перечисленных — hibernate.properties .
Конфигурация org.hibernate.cfg.Configuration содержит стартовые настройки, которые будут отброшены после создания SessionFactory .
3.2. Получение SessionFactory
Когда все отображения были проанализированы с помощью org.hibernate.cfg.Configuration , приложение должно получить фабрику для экземпляров org.hibernate.Session . Эта фабрика предназначена для совместного использования всеми прикладными потоками:
Hibernate позволяет вашему приложению создавать экземпляры более чем одного org.hibernate.SessionFactory . Это полезно, если вы используете несколько баз данных.
3.3. Соединения JDBC
Желательно, чтобы org.hibernate.SessionFactory создавал и объединял в пул JDBC-соединения для вас. Такой подход позволяет очень просто открыть org.hibernate.Session :
После запуска задачи, требующей доступа к базе данных, соединение JDBC будет получено из пула.
Прежде чем вы сможете это сделать, нужно передать некоторые свойства соединения JDBC в Hibernate. Все имена и семантика свойств Hibernate определены в классе org.hibernate.cfg.Environment . Ниже перечислены наиболее важные настройки для конфигурации соединения JDBC.
Таблица 3.1. Свойства Hibernate JDBC
Имя свойства | Назначение |
---|---|
hibernate.connection.driver_class | JDBC driver class |
hibernate.connection.url | JDBC URL |
hibernate.connection.username | имя пользователя JDBC |
hibernate.connection.password | пароль пользователя JDBC |
hibernate.connection.pool_size | максимальное число соединений в пуле |
Алгоритм объединения пула Hibernate довольно рудиментарный. Он призван помочь вам начать работу и не предназначен для использования в продакшене или даже для тестирования производительности. Вы должны использовать сторонний пул для обеспечения максимальной производительности и стабильности. Просто замените свойство hibernate.connection.pool_size с конкретными настройками пула соединений. Это отключит внутренний пул Hibernate. Например, вы можете использовать c3p0.
C3P0 — пул соединений JDBC с открытым исходным кодом, распространяемый вместе с Hibernate в каталоге lib . Hibernate будет использовать свой org.hibernate.connection.C3P0ConnectionProvider для объединения пулов если вы установите свойства hibernate.c3p0.* . Если вы хотите использовать Proxool, обратитесь к упакованным hibernate.properties и веб-сайту Hibernate за дополнительной информацией.
Ниже приведен пример файла hibernate.properties для c3p0:
Для использования внутри сервера приложений вы почти всегда должны настраивать Hibernate для получения соединений с помощью javax.sql.Datasource , зарегистрированного в JNDI. Вам нужно будет установить хотя бы одно из следующих свойств:
Таблица 3.2. Свойства Hibernate Datasource
Имя свойства | Назначение |
---|---|
hibernate.connection.datasource | имя datasource JNDI |
hibernate.jndi.url | URL провайдера JNDI (необязательный) |
hibernate.jndi.class | Класс JNDI InitialContextFactory (необязательный) |
hibernate.connection.username | имя пользователя бд (необязательный) |
hibernate.connection.password | пароль пользователя бд (необязательный) |
Ниже приведен пример файла hibernate.properties для сервера приложений, предоставляемого источником данных JNDI:
Соединения JDBC, полученные из источника данных JNDI, будут автоматически участвовать в транзакциях, управляемых контейнером сервера приложений.
Произвольные свойства соединения могут быть заданы путем добавления « hibernate.connection » к имени свойства соединения. Например, вы можете указать свойство соединения charSet с помощью hibernate.connection.charSet .
Вы можете определить свою собственную стратегию плагина для получения соединений JDBC, реализовав интерфейс org.hibernate.connection.ConnectionProvider и указав свою пользовательскую реализацию через свойство hibernate.connection.provider_class .
3.4. Необязательные свойства конфигурации
Существует ряд других свойств, которые управляют поведением Hibernate во время выполнения. Все они являются необязательными и имеют разумные значения по умолчанию.
Внимание
Некоторые из этих свойств являются исключительно «системными». Свойства системного уровня могут быть установлены только через java -Dproperty=value или hibernate.properties . Они не могут быть установлены другими способами, описанными выше.
Таблица 3.3. Свойства конфигурации Hibernate
Имя свойства | Назначение |
---|---|
hibernate.dialect | Имя класса Hibernate org.hibernate.dialect.Dialect , которое позволяет Hibernate генерировать SQL, оптимизированный для конкретной реляционной базы данных. |
В большинстве случаев Hibernate самостоятельно сможет выбрать правильный org.hibernate.dialect.Dialect реализованный на основе JDBC metadata , возвращенного драйвером JDBC.
значения: true | false
значения: true | false
значения: рекоменддуемые значения от 0 до 3
значения: рекоменддуемые значения 4 , 8 , 16
значения: dynamic-map | pojo
значения: true | false
значения: true | false
значения: true | false
значения: true | false
значения: true | false
Заметка
Мы рекомендуем во всех новых проектах, которые используют @GeneratedValue , также установить hibernate.id.new_generator_mappings=true , поскольку новые генераторы более эффективны и ближе к семантике спецификации JPA 2. Однако они обратно не совместимы с существующими базами данных (если для генерации идентификатора используется последовательность или таблица).
Таблица 3.4. Свойства JDBC и соединений в Hibernate
Имя свойства | Назначение |
---|---|
hibernate.jdbc.fetch_size | Ненулевое значение определяет размер выборки JDBC (вызывает Statement.setFetchSize() ). |
hibernate.jdbc.batch_size | Ненулевое значение включает использование пакетного обновления JDBC2 в Hibernate. |
значения: рекоменддуемые значения между 5 и 30
значения: true | false
значения: true | false
значения: true | false
значения: true | false
значения: 1, 2, 4, 8
значения: true | false
значения: auto по умолчанию | on_close | after_transaction | after_statement
Этот параметр влияет только на сессии, возвращённые SessionFactory.openSession . Для сессий, полученных с помощью SessionFactory.getCurrentSession , реализация CurrentSessionContext , настроенная для использования, управляет режимом освобождения соединения. См. Параграф «2.2. Контекстные сессии»
и его значение в DriverManager.getConnection() .
и его значение в JNDI InitialContextFactory .
Таблица 3.5. Свойства кэша в Hibernate
Имя свойства | Назначение |
---|---|
hibernate.cache.provider_class | Имя класса пользовательского CacheProvider . |
значения: true | false
значения: true | false
значения: true | false
значения: true | false
значения: true | false
Таблица 3.6. Свойства транзакций в Hibernate
Имя свойства | Назначение |
---|---|
hibernate.transaction.factory_class | Имя класса TransactionFactory для использования с Hibernate Transaction API (по умолчанию используется JDBCTransactionFactory ). |
значения: true | false
значения: true | false
Таблица 3.7. Прочие свойства
Имя свойства | Назначение |
---|---|
hibernate.current_session_context_class | Поставьте индивидуальную стратегию для определения «текущей» сессии. См. Параграф «2.2. Контекстные сессии». для получения дополнительной информации о встроенных стратегиях. |
значения: jta | thread | managed | custom.Class
пример: org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory или org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory
значения: validate | update | create | create-drop
Отделяемые запятыми имена необязательных файлов, содержащих SQL-выражения DML, выполняемые во время создания SessionFactory . Это полезно для тестирования или демонстрации: добавив инструкции INSERT, например, вы можете заполнить свою базу данных минимальным набором данных при ее развёртывании.
Порядок файлов имеет значение, операторы в файлах выполняются перед операциями следующих файлов. Эти инструкции выполняются если схема создана, т. е. если hibernate.hbm2ddl.auto настроен на create или create-drop .
Имя класса пользовательского ImportSqlCommandExtractor (по умолчанию используется встроенный SingleLineSqlCommandExtractor ). Это полезно для реализации выделенного парсера, который извлекает отдельные инструкции SQL из каждого файла импорта. Hibernate предоставляет также MultipleLinesSqlCommandExtractor , который поддерживает инструкции/комментарии и цитируемые строки, распредёленные по нескольким строкам (обязательная точка с запятой в конце каждого оператора).
Включает использование манипуляций с байт-кодом вместо рефлексии во время выполнения (runtime). Это свойство системного уровня и не может быть установлено в файле hibernate.cfg.xml . Иногда рефлексия может быть полезна при поиске и устранении неисправностей. Hibernate всегда требует javassist, даже если вы отключите оптимизатор.
значения: true | false
На данный момент javassist является единственным поддерживаемым провайдером байт-кода.
3.4.1. Диалекты SQL
Всегда устанавливайте свойство hibernate.dialect в соответствующий подкласс org.hibernate.dialect.Dialect для вашей базы данных. Если вы укажете диалект Hibernate будет использовать разумные значения по умолчанию для некоторых других свойств, перечисленных выше. Это означает, что вам не нужно будет указывать их вручную.
Таблица 3.8. Hibernate SQL диалекты ( hibernate.dialect )
RDBMS | Диалект |
---|---|
CUBRID 8.3 and later | org.hibernate.dialect.CUBRIDDialect |
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
Firebird | org.hibernate.dialect.FirebirdDialect |
FrontBase | org.hibernate.dialect.FrontbaseDialect |
H2 | org.hibernate.dialect.H2Dialect |
HyperSQL (HSQL) | org.hibernate.dialect.HSQLDialect |
Informix | org.hibernate.dialect.InformixDialect |
Ingres | org.hibernate.dialect.IngresDialect |
Ingres 9 | org.hibernate.dialect.Ingres9Dialect |
Ingres 10 | org.hibernate.dialect.Ingres10Dialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
InterSystems Cache 2007.1 | org.hibernate.dialect.Cache71Dialect |
JDataStore | org.hibernate.dialect.JDataStoreDialect |
Mckoi SQL | org.hibernate.dialect.MckoiDialect |
Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
Microsoft SQL Server 2012 | org.hibernate.dialect.SQLServer2012Dialect |
Mimer SQL | org.hibernate.dialect.MimerSQLDialect |
MySQL | org.hibernate.dialect.MySQLDialect |
MySQL with InnoDB | org.hibernate.dialect.MySQLInnoDBDialect |
MySQL with MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
MySQL5 | org.hibernate.dialect.MySQL5Dialect |
MySQL5 with InnoDB | org.hibernate.dialect.MySQL5InnoDBDialect |
Oracle 8i | org.hibernate.dialect.Oracle8iDialect |
Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
Oracle 10g and later | org.hibernate.dialect.Oracle10gDialect |
Oracle TimesTen | org.hibernate.dialect.TimesTenDialect |
Pointbase | org.hibernate.dialect.PointbaseDialect |
PostgreSQL 8.1 | org.hibernate.dialect.PostgreSQL81Dialect |
PostgreSQL 8.2 | org.hibernate.dialect.PostgreSQL82Dialect |
PostgreSQL 9 and later | org.hibernate.dialect.PostgreSQL9Dialect |
Progress | org.hibernate.dialect.ProgressDialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
SAP HANA (column store) | org.hibernate.dialect.HANAColumnStoreDialect |
SAP HANA (row store) | org.hibernate.dialect.HANARowStoreDialect |
Sybase | org.hibernate.dialect.SybaseDialect |
Sybase 11 | org.hibernate.dialect.Sybase11Dialect |
Sybase ASE 15.5 | org.hibernate.dialect.SybaseASE15Dialect |
Sybase ASE 15.7 | org.hibernate.dialect.SybaseASE157Dialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Teradata | org.hibernate.dialect.TeradataDialect |
Unisys OS 2200 RDMS | org.hibernate.dialect.RDMSOS2200Dialect |
3.4.2. Outer Join Fetching
Если ваша база данных поддерживает внешние соединения (outer joins) типа ANSI, Oracle или Sybase, outer join fetching (выборка по внешнему соединению) часто увеличивает производительность, ограничивая количество обращений в ту или иную базу данных за счет большей работы, выполняемой самой базой данных. Выборка по внешнему соединению (outer join fetching) позволяет получить целый граф объектов, соединённых ассоциациями «один-ко-многим», «многие-ко-многим» и «один-к-одному», которые будут извлекаться в одном SQL SELECT .
Выборку по внешнему соединению (outer join fetching) можно отключить глобально, установив свойство hibernate.max_fetch_depth равным 0 . Параметр 1 или выше позволяет использовать выборку по внешнему соединению для ассоциаций «один к одному» и «многие-к-одному», которые были отображены с помощью fetch=«join» .
Дополнительную информацию см. в разделе 20.1 «Стратегии выборки».
3.4.3. Двоичные потоки (binary streams)
Oracle ограничивает размер массивов типа byte , которые могут быть переданы в и/или из его драйвера JDBC. Если вы хотите использовать большие экземпляры типов byte или serializable , вы должны включить hibernate.jdbc.use_streams_for_binary . Это свойство системного уровня.
3.4.4. Кэш второго уровня и кэш запросов
Свойства с префиксом hibernate.cache позволяют использовать систему кэширования второго уровня с областью видимости процесса или кластера. Дополнительную информацию см. в разделе 20.2 «Кэш второго уровня».
3.4.5. Замена языка запроса
Вы можете определить новые токены запросов Hibernate, используя hibernate.query.substitutions . Например:
Это приведет к тому, что токены true и false будут переведены в целочисленные (integer) литералы в сгенерированном SQL.
Это позволит вам переименовать SQL функцию LOWER .
3.4.6. Статистика Hibernate
Если вы включите hibernate.generate_statistics , то Hibernate предоставит ряд показателей, которые полезны при настройке запущенной системы через SessionFactory.getStatistics() . Также для отображения этих статистических данных Hibernate может быть настроен через JMX. Прочтите об интерфейсах org.hibernate.stats в Javadoc для получения дополнительной информации.
3.5. Логирование
Важно
Полностью устарело. Hibernate использует JBoss Logging, начиная с 4.0. Документация появится как только мы перенесём этот контент в Руководство разработчика.
Hibernate использует Simple Logging Facade for Java (SLF4J) для логирования различных системных событий. SLF4J может направлять вывод журнала в несколько фреймворков регистрации (NOP, Simple, log4j v1.2, JDK 1.4 logging, JCL или logback) в зависимости от выбранного вами. Чтобы настроить ведение журнала вам понадобится slf4j-api.jar в вашем classpath вместе с файлом jar для выбранного вами логгера ( slf4j-log4j12.jar в случае Log4J). Более подробную информацию см. в документации SLF4J. Для использования Log4j вам также необходимо поместить файл log4j.properties в classpath. Пример файла свойств распространяется вместе с Hibernate в каталоге src/ .
Рекомендуется ознакомиться с сообщениями журнала Hibernate. Было сделано много работы, чтобы сделать журнал Hibernate максимально подробным, не делая его нечитаемым. Наиболее интересными категориями журналов являются:
Таблица 3.9. Категории лога Hibernate
Категория | Функция |
---|---|
org.hibernate.SQL | Записывать все инструкции SQL DML во время их выполнения |
org.hibernate.type | Записывать все JDBC параметры |
org.hibernate.tool.hbm2ddl | Записывать все инструкции SQL DDL во время их выполнения |
org.hibernate.pretty | Записывать состояние всех сущностей (не более 20 сущностей), связанных с session во время очистки (flush) |
org.hibernate.cache | Записывать всю активность кэша второго уровня |
org.hibernate.transaction | Записывать всю активность, связанную с транзакциями |
org.hibernate.jdbc | Записывать все ресурсы JDBC |
org.hibernate.hql.internal.ast.AST | Записывать все HQL и SQL AST во вермя парсинга запросов |
org.hibernate.secure | Записывать все запросы авторизации JAAS |
org.hibernate | Записывать всё. Это огромное количество имформации, но полезно для поиска и устранения проблем |
При разработке приложений с Hibernate вы почти всегда должны работать с включённым debug для категории org.hibernate.SQL или установить свойство hibernate.show_sql в true .
3.6. Имплементация NamingStrategy
Интерфейс org.hibernate.cfg.NamingStrategy позволяет указать «стандарт именования» для объектов базы данных и элементов схемы.
Вы можете предоставить правила для автоматического создания идентификаторов базы данных из идентификаторов Java или для обработки «логических» столбцов и имен таблиц, указанных в файле отображения, в «физические» имена таблиц и столбцов. Эта функция помогает уменьшить многословие файла отображения, устраняя повторяющийся куски (например, префиксы TBL_). Стратегия по умолчанию, используемая Hibernate, минимальна.
Вы можете указать другую стратегию, вызвав Configuration.setNamingStrategy() перед добавлением отображений:
org.hibernate.cfg.ImprovedNamingStrategy — это встроенная стратегия, которая может быть полезной отправной точкой для некоторых приложений.
3.7. Имплементация PersisterClassProvider
Вы можете настроить реализацию persister, используемую для сохранения ваших сущностей и коллекций:
- по умолчанию Hibernate использует persisters, которые имеют смысл в реляционной модели и следуют спецификации Java Persistence
- вы можете определить реализацию PersisterClassProvider, которая предоставляет класс persister, используемый для данной сущности или коллекции
- наконец, вы можете переопределить их на основе сущности и коллекции в отображении с использованием @Persister или его XML эквивалента.
Каждый последующий элемент в списке выше по приоритету.
Вы можете передать экземпляр PersisterClassProvider в объект Configuration .
Методы провайдера класса persister при возврате непустого класса persister переопределяют константы Hibernate по умолчанию. Имя сущности или роль коллекции передаются методам. Это хороший способ централизовать основную логику persist-приложений вместо того, чтобы распространять их на каждом отображении сущности или коллекции.
3.8. XML-файл конфигурации
Альтернативный подход к настройке — указать полную конфигурацию в файле с именем hibernate.cfg.xml . Этот файл может использоваться как замена файла hibernate.properties или, если они присутствуют, для переопределения свойств.
Файл конфигурации XML по умолчанию должен находиться в корне вашего CLASSPATH. Вот пример:
Преимуществом этого подхода является экстернализация имен файлов отображения для конфигурации. hibernate.cfg.xml также более удобен, если вам нужно настроить кэш-память Hibernate. Это ваш выбор использовать либо hibernate.properties , либо hibernate.cfg.xml . Оба они эквивалентны, за исключением вышеупомянутых преимуществ использования синтаксиса XML.
С конфигурацией XML запуск Hibernate прост:
Вы можете выбрать другой файл конфигурации XML, используя:
3.9. Интеграция на сервер приложений Java EE
Hibernate имеет следующие точки интеграции для инфраструктуры J2EE:
- Container-managed datasources (Источники данных (datasource), управляемые контейнерами): Hibernate может использовать JDBC-соединения, управляемые контейнером, и предоставляемые через JNDI. Обычно JTA-совместимый TransactionManager и ResourceManager заботятся об управлении транзакциями (CMT), особенно распределенной обработкой транзакций из нескольких источниках данных (datasource). Вы также можете разделаить границы транзакций (BMT) или использовать дополнительный API транзакций Hibernate для того, чтобы сохранить ваш код переносимым.
- Automatic JNDI binding (Автоматическое связывание JNDI): Hibernate может связать свой SessionFactory с JNDI после запуска.
- JTA Session binding: Hibernate Session может автоматически привязываться к объёму транзакций JTA. Просто найдите SessionFactory в JNDI и получите текущую сессию ( Session ). Пусть Hibernate управляет очисткой (flushing) и закрытием сессии, когда ваша транзакция JTA завершается. Разделение транзакций является либо декларативной (CMT), либо программной (BMT/UserTransaction).
- JMX deployment (Развертывание JMX): если у вас есть сервер приложений, поддерживающий JMX (например, JBoss AS), вы можете выбрать для развертывания Hibernate в качестве управляемого MBean. Это экономит вам одну строку кода (создание SessionFactory ) в конфигурации. Контейнер запустит ваш HibernateService , а также позаботится о зависимостях службы (источник данных (datasource) должен быть доступен до запуска Hibernate и т. д.).
В зависимости от вашей среды вам может потребоваться установить для параметра конфигурации hibernate.connection.aggressive_release значение true , если на вашем сервере приложений отображаются исключения «connection containment».
3.9.1. Конфигурация стратегии транзакций
API сессии Hibernate не зависит от любой системы разделения транзакций в вашей архитектуре. Если вы позволяете Hibernate использовать JDBC напрямую через пул соединений, вы можете начинать и заканчивать свои транзакции вызовами JDBC API. Если вы запустили сервер приложений J2EE, вы можете использовать транзакции, управляемые бинами, и при необходимости обращаться к API JTA и UserTransaction .
Чтобы переносить код между этими двумя (и другими) средами, мы рекомендуем дополнительный Hibernate Transaction API, который обертывает и скрывает базовую систему. Вы должны указать фабричный класс для экземпляров транзакций, установив свойство конфигурации Hibernate hibernate.transaction.factory_class .
Существуют три стандартных или встроенных варианта:
делегирует транзакции базе данных (JDBC) (по умолчанию)
делегирует транзакции, управляемые контейнером, если в этом контексте выполняется существующая транзакция (например, метод бина сессии (session) EJB). В противном случае запускается новая транзакция и используются транзакции, управляемые бином.
делегирует JTA транзакциям, управляемым контейнерами
Вы также можете определить свои собственные стратегии транзакций (например для сервиса транзакций CORBA).
Некоторые функции в Hibernate (кэш второго уровня, контекстные сессии с JTA и т. д.) требуют доступа к JTA TransactionManager в управляемой среде. На сервере приложений, поскольку J2EE не стандартизирует единый механизм, вы должны указать, как Hibernate должен получить ссылку на TransactionManager :
Таблица 3.10. JTA TransactionManagers
Фабрика транзакций | Сервер приложений |
---|---|
org.hibernate.transaction.JBossTransactionManagerLookup | JBoss AS |
org.hibernate.transaction.WeblogicTransactionManagerLookup | Weblogic |
org.hibernate.transaction.WebSphereTransactionManagerLookup | WebSphere |
org.hibernate.transaction.WebSphereExtendedJTATransactionLookup | WebSphere 6 |
org.hibernate.transaction.OrionTransactionManagerLookup | Orion |
org.hibernate.transaction.ResinTransactionManagerLookup | Resin |
org.hibernate.transaction.JOTMTransactionManagerLookup | JOTM |
org.hibernate.transaction.JOnASTransactionManagerLookup | JOnAS |
org.hibernate.transaction.JRun4TransactionManagerLookup | JRun4 |
org.hibernate.transaction.BESTransactionManagerLookup | Borland ES |
org.hibernate.transaction.JBossTSStandaloneTransactionManagerLookup | JBoss TS используется отдельно (вне JBoss AS и JNDI сред). Для работы с org.jboss.jbossts:jbossjta:4.11.0.Final |
3.9.2. JNDI-связанный SessionFactory
Связанный с JNDI Hibernate SessionFactory может упростить функцию поиска фабрики и создать новые сессии ( Session ). Однако это не связано с источником данных ( Datasource ), связанным с JNDI; оба просто используют один и тот же реестр.
Если вы хотите связать SessionFactory с пространством имен JNDI, укажите имя (например, java:hibernate/SessionFactory ), используя свойство hibernate.session_factory_name . Если это свойство опущено SessionFactory не будет привязан к JNDI. Это особенно полезно в средах с реализацией JNDI только для чтения (например, в Tomcat).
При привязке SessionFactory к JNDI, Hibernate будет использовать значения hibernate.jndi.url , hibernate.jndi.class для создания исходного контекста. Если они не указаны, будет использоваться InitialContext по умолчанию.
Hibernate автоматически поместит SessionFactory в JNDI после вызова cfg.buildSessionFactory() . Это означает, что у вас будет этот вызов в коде запуска или классе утилиты в вашем приложении, если только вы не используете JMX-развертывание с HibernateService (это более подробно обсуждается позже).
Если вы используете JNDI SessionFactory , EJB или любой другой класс, вы можете получить SessionFactory с помощью поиска JNDI.
Источник