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 . При использовании XML-файла Hibernate может генерировать исходный код скелета для классов персистентности. Это вспомогательный параметр при использовании аннотаций. Hibernate может использовать XML-файл или аннотации Java для поддержки схемы базы данных .
Предусмотрены средства для организации связей «один-ко-многим» и «многие-ко-многим» между классами. [2] : 140–171 Помимо управления ассоциациями между объектами, Hibernate также может управлять рефлексивными ассоциациями, в которых объект имеет отношение «один ко многим» с другими экземплярами типа класса .
Hibernate поддерживает сопоставление пользовательских типов значений. Это делает возможными следующие сценарии:
Определение: объекты в объектно-ориентированном приложении следуют принципам ООП , тогда как объекты серверной части следуют принципам нормализации базы данных , что приводит к различным требованиям к представлению. Эта проблема называется « объектно-реляционное несоответствие импедансов ». Сопоставление — это способ решения проблемы несоответствия объектно-реляционного импеданса.
Сопоставление сообщает инструменту ORM, какой объект класса Java следует хранить в какой таблице базы данных.
Hibernate предоставляет язык на основе SQL , называемый Hibernate Query Language (HQL), для написания SQL-подобных запросов к объектам данных Hibernate. Критериальные запросы предоставляются как объектно-ориентированная альтернатива HQL. Запрос критериев используется для изменения объектов и предоставления ограничений для объектов. [2] : 347–349 HQL (язык запросов Hibernate) — это объектно-ориентированная версия 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 Напротив, компонент подчинен объекту, и им можно манипулировать только в отношении этого объекта. Например, объект «Альбом» может представлять сущность; но объект «Дорожки», связанный с объектами «Альбом», будет представлять собой компонент сущности «Альбом», если предполагается, что треки можно сохранять или извлекать из базы данных только через объект «Альбом». В отличие от J2EE, Hibernate может переключать базы данных.
Hibernate был запущен в 2001 году Гэвином Кингом вместе с коллегами из Cirrus Technologies как альтернатива использованию объектных компонентов в стиле EJB2. Первоначальная цель заключалась в том, чтобы предложить лучшие возможности сохраняемости, чем те, которые предлагает EJB2; путем упрощения сложностей и дополнения некоторых недостающих функций.
В начале 2003 года команда разработчиков Hibernate приступила к выпуску версий Hibernate2, которые предлагали множество существенных улучшений по сравнению с первой версией.
JBoss, Inc. (теперь часть Red Hat ) позже наняла ведущих разработчиков Hibernate для дальнейшего развития.
В 2005 году была выпущена версия Hibernate 3.0. Ключевые функции включали новую архитектуру перехватчика/обратного вызова, определяемые пользователем фильтры и аннотации 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. Он имеет улучшенную загрузку, 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]
Hibernate API предоставляется в пакете Java org.hibernate
. [12]
Интерфейс org.hibernate.SessionFactory
представляет собой собственную эквивалентную версию стандарта JPA EntityManagerFactory
. [2] : 26
Интерфейс org.hibernate.Session
[ 13] представляет собой сеанс Hibernate, т.е. основную точку манипуляций, выполняемых над объектами базы данных. Последние действия включают в себя (помимо прочего) управление состоянием персистентности ( переходное , постоянное , отсоединенное [ необходимо пояснение ] ) объектов, извлечение постоянных из базы данных и управление демаркацией транзакций [ необходимо пояснение ] .
Предполагается, что A Session
будет длиться столько же, сколько логическая транзакция в базе данных. Из-за последней функции Session
не ожидается, что реализации будут потокобезопасными и не будут использоваться несколькими клиентами.
Программное обеспечение Hibernate включает в себя следующие компоненты: [14]