Hibernate ORM (или просто Hibernate ) — это объектно-реляционный инструмент отображения [2] : §1.2.2, [12] для языка программирования Java . Он предоставляет фреймворк для отображения объектно-ориентированной модели домена в реляционную базу данных . Hibernate обрабатывает проблемы несоответствия объектно-реляционного импеданса , заменяя прямые, постоянные доступы к базе данных высокоуровневыми функциями обработки объектов.
Hibernate — это свободное программное обеспечение , распространяемое по лицензии GNU Lesser General Public License 2.1.
Основная функция Hibernate — отображение классов Java в таблицы базы данных и отображение типов данных Java в типы данных SQL . Hibernate также предоставляет возможности запроса и извлечения данных. Он генерирует вызовы SQL и освобождает разработчика от ручной обработки и преобразования объектов набора результатов.
Отображение классов Java в таблицы базы данных реализуется с помощью конфигурации XML- файла или с помощью Java Annotations . При использовании XML-файла Hibernate может генерировать скелет исходного кода для классов сохранения. Это вспомогательно, когда используются аннотации. Hibernate может использовать XML-файл или Java-аннотации для поддержания схемы базы данных .
Предоставляются возможности для организации отношений «один ко многим» и «многие ко многим» между классами. [2] : 140–171 Помимо управления ассоциациями между объектами, Hibernate также может управлять рефлексивными ассоциациями, в которых объект имеет отношение «один ко многим» с другими экземплярами типа класса .
Hibernate поддерживает отображение пользовательских типов значений. Это делает возможными следующие сценарии:
Определение: Объекты в объектно-ориентированном приложении следуют принципам ООП , тогда как объекты в бэкенде следуют принципам нормализации базы данных , что приводит к разным требованиям к представлению. Эта проблема называется « несоответствием объектно-реляционного импеданса ». Отображение — это способ решения проблемы несоответствия объектно-реляционного импеданса.
Сопоставление информирует инструмент ORM о том, какой объект класса Java следует хранить в той или иной таблице базы данных.
Hibernate предоставляет вдохновленный SQL язык, называемый Hibernate Query Language (HQL), для написания SQL-подобных запросов к объектам данных Hibernate. Criteria Queries предоставляются как объектно-ориентированная альтернатива HQL. Criteria Query используется для изменения объектов и предоставления ограничений для объектов. [2] : 347–349 HQL (Hibernate Query Language) — это объектно-ориентированная версия SQL. Он генерирует независимые от базы данных запросы, поэтому нет необходимости писать запросы, специфичные для базы данных. Без этой возможности изменение базы данных потребовало бы также изменения отдельных SQL-запросов, что привело бы к проблемам обслуживания.
Hibernate обеспечивает прозрачное сохранение для обычных старых объектов Java (POJO). [2] : 37–38 Единственным строгим требованием для постоянного класса является конструктор без аргументов , [2] : 39 хотя и не обязательно public
. Правильное поведение в некоторых приложениях также требует особого внимания к методам equals(Object obj)
и hashCode()
в Object
классах. [3] Hibernate рекомендует предоставлять атрибут идентификатора, и это планируется сделать обязательным требованием в будущем выпуске. [4]
Коллекции объектов данных обычно хранятся в классах коллекций Java, таких как реализации интерфейсов Set
и List
. Также поддерживаются дженерики Java , представленные в Java 5. Hibernate можно настроить на ленивую загрузку связанных коллекций. [2] : 289–293 Ленивая загрузка используется по умолчанию в Hibernate 3.
Связанные объекты могут быть настроены на каскадирование операций от одного объекта к другому. Например, Album
объект родительского класса может быть настроен на каскадирование своих операций save
и к своим объектам дочернего класса.delete
Track
Hibernate можно использовать как в автономных приложениях Java , так и в приложениях Java EE с использованием сервлетов , сессионных компонентов EJB и компонентов служб JBI . Его также можно включить в качестве функции в другие языки программирования. Например, Adobe интегрировала Hibernate в версию 9 ColdFusion (которая работает на серверах приложений J2EE) с уровнем абстракции новых функций и синтаксиса, добавленных в CFML .
На жаргоне Hibernate сущность — это автономный объект в постоянном механизме Hibernate, которым можно манипулировать независимо от других объектов. [2] : 62–74 Напротив, компонент подчиняется сущности и может манипулироваться только по отношению к этой сущности. Например, объект Album может представлять сущность; но объект Tracks, связанный с объектами Album, будет представлять компонент сущности Album, если предполагается, что Tracks можно сохранять или извлекать из базы данных только через объект Album. В отличие от J2EE, Hibernate может переключать базы данных.
Hibernate был создан в 2001 году Гэвином Кингом с коллегами из Cirrus Technologies в качестве альтернативы использованию компонентов сущностей в стиле EJB2. Первоначальной целью было предложить лучшие возможности сохранения, чем те, которые предлагает EJB2; путем упрощения сложностей и дополнения некоторых недостающих функций.
В начале 2003 года команда разработчиков Hibernate начала выпуск Hibernate2, который предлагал множество существенных улучшений по сравнению с первым выпуском.
Позднее компания JBoss, Inc. (теперь часть Red Hat ) наняла ведущих разработчиков Hibernate для дальнейшего развития своей платформы.
В 2005 году была выпущена версия Hibernate 3.0. Ключевые особенности включали новую архитектуру Interceptor/Callback, определяемые пользователем фильтры и аннотации JDK 5.0 (функция метаданных Java ). По состоянию на 2010 год [обновлять]Hibernate 3 (версия 3.5.0 и выше) был сертифицированной реализацией спецификации Java Persistence API 2.0 через оболочку для модуля Core, которая обеспечивает соответствие стандарту JSR 317. [5]
В декабре 2011 года был выпущен Hibernate Core 4.0.0 Final. Он включает в себя новые функции, такие как поддержка многопользовательской аренды, введение ServiceRegistry (серьезное изменение в том, как Hibernate создает и управляет «сервисами»), улучшенное открытие сеанса из SessionFactory, улучшенная интеграция через org.hibernate.integrator.spi.Integrator и автоматическое обнаружение, поддержка интернационализации , коды сообщений в журнале и большее различие между API, SPI или классами реализации. [6]
В декабре 2012 года был выпущен Hibernate ORM 4.1.9 Final. [7]
В марте 2013 года был выпущен Hibernate ORM 4.2 Final. [8]
В декабре 2013 года был выпущен Hibernate ORM 4.3.0 Final. [9] Он включает Java Persistence API 2.1 .
В сентябре 2015 года вышел Hibernate ORM 5.0.2 Final. Он улучшил bootstrapping, hibernate-java8, hibernate-spatial, поддержку Karaf.
В ноябре 2018 года вышел Hibernate ORM 5.1.17 Final. Это финальный релиз серии 5.1.
В октябре 2018 года вышел Hibernate ORM 5.3 Final. В нем реализовано кэширование наследования Java Persistence API 2.2 .
В декабре 2018 года был выпущен Hibernate ORM 5.4.0 Final. [10]
В октябре 2022 года был выпущен Hibernate ORM 6.1.4 Final. [11]
API Hibernate предоставляется в пакете Java org.hibernate
. [12]
Интерфейс org.hibernate.SessionFactory
является собственной эквивалентной версией стандарта JPA EntityManagerFactory
. [2] : 26
Интерфейс [13]org.hibernate.Session
представляет собой сеанс Hibernate, т. е. основную точку манипуляции, выполняемой над сущностями базы данных. Последние действия включают (помимо прочего) управление состоянием сохранения ( транзиентное , сохраняющееся , отсоединенное [ требуется разъяснение ] ) объектов, извлечение сохраняющихся из базы данных и управление разграничением транзакций [ требуется разъяснение ] .
A Session
предназначен для длительности логической транзакции в базе данных. Из-за последней особенности Session
реализации не должны быть потокобезопасными или использоваться несколькими клиентами.
Программное обеспечение Hibernate включает в себя следующие компоненты: [14]