Введение

Инструмент объектно-реляционного отображения

Hibernate ORM (или просто Hibernate) — это инструмент объектно-реляционного отображения для языка программирования Java. Он предоставляет основу для сопоставления объектно-ориентированной предметной области с реляционной базой данных. Hibernate решает проблемы несоответствия объектно-реляционных моделей, заменяя прямой, постоянный доступ к базе данных функциями обработки объектов высокого уровня. Hibernate является свободным программным обеспечением, распространяемым под лицензией GNU Lesser General Public License 2.1. Основная функция Hibernate — это сопоставление классов Java с таблицами баз данных и типов данных Java с типами данных SQL. Hibernate также предоставляет средства для запроса и извлечения данных. Он генерирует SQL-запросы и избавляет разработчика от ручной обработки и преобразования объектов из результирующего набора.

Язык запросов в режиме спячки (HQL)

Hibernate предоставляет язык, вдохновленный SQL, под названием Hibernate Query Language (HQL) для написания запросов, аналогичных SQL, к объектам данных Hibernate. Критериальные запросы (Criteria Queries) предоставляются как объектно-ориентированная альтернатива HQL. Критериальные запросы используются для изменения объектов и задания ограничений для них. HQL (Hibernate Query Language) – это объектно-ориентированная версия SQL. Он генерирует запросы, не зависящие от конкретной базы данных, что избавляет от необходимости писать запросы, специфичные для определенной СУБД. Без этой возможности, замена базы данных потребовала бы изменения каждого SQL-запроса в отдельности, что привело бы к проблемам с поддержкой и сопровождением.

Настойчивость

Hibernate обеспечивает прозрачное сохранение для простых Java-объектов (POJO). Единственным строгим требованием к персистентному классу является конструктор без аргументов, хотя корректное поведение в некоторых приложениях также требует особого внимания к методам `equals()` и `hashCode()` в классах сущностей. Hibernate рекомендует предоставлять атрибут идентификатора, и это планируется сделать обязательным требованием в будущей версии. Коллекции объектов данных обычно хранятся в классах коллекций Java, таких как реализации интерфейсов `List` и `Set`. Java generics, представленные в Java 5, также поддерживаются. Hibernate можно настроить на ленивую загрузку связанных коллекций. Ленивая загрузка является настройкой по умолчанию, начиная с Hibernate 3. Связанные объекты могут быть настроены на каскадирование операций от одного объекта к другому. Например, объект родительского класса может быть настроен на каскадирование операций `save()` и `delete()` к объектам его дочернего класса.

Интеграция

Hibernate может использоваться как в самостоятельных Java-приложениях, так и в Java EE-приложениях с использованием сервлетов, сеансовых бинов EJB и компонентов сервисов JBI. Его также можно интегрировать как функциональность в другие языки программирования. Например, компания Adobe включила Hibernate в версию 9 ColdFusion (которая работает на J2EE-серверах приложений), добавив в CFML абстрактный слой новых функций и синтаксиса.

Субъекты и компоненты

В терминологии Hibernate, сущность — это независимый объект в механизме постоянного хранения Hibernate, которым можно управлять независимо от других объектов. В отличие от этого, компонент подчинен сущности и может быть изменен только в контексте этой сущности. Например, объект 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. Ключевые особенности включали новую архитектуру перехватчиков/обратных вызовов, пользовательские фильтры и аннотации JDK 5.0 (функция метаданных Java). Hibernate 3 (версия 3.5.0 и выше) являлся сертифицированной реализацией спецификации Java Persistence API 2.0 посредством обертки для Core-модуля, обеспечивающей соответствие стандарту JSR 317. В декабре 2011 года был выпущен Hibernate Core 4.0.0 Final. Он включал новые функции, такие как поддержка многоарендности, внедрение ServiceRegistry (значительное изменение в способе создания и управления "сервисами" в Hibernate), улучшенное открытие сессий из SessionFactory, расширенная интеграция через org.hibernate.integrator.spi.Integrator и автоматическое обнаружение, поддержка интернационализации, коды сообщений в логах и более четкое разграничение между API, SPI и классами реализации. В декабре 2012 года был выпущен Hibernate ORM 4.1.9 Final. В марте 2013 года был выпущен Hibernate ORM 4.2 Final. В декабре 2013 года был выпущен Hibernate ORM 4.3.0 Final, поддерживающий 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. В октябре 2022 года был выпущен Hibernate ORM 6.1.4 Final.

Интерфейс программирования приложений

Hibernate API предоставляется в пакете Java.

Интерфейс "Организация.Хибернация.Сессия"

Интерфейс представляет собой нативную реализацию стандартного API JPA.

Интерфейс сеанса

Интерфейс представляет собой сессию Hibernate, то есть основную точку взаимодействия при работе с сущностями базы данных. Эти операции включают (в частности) управление состоянием объектов (временное, постоянное, отсоединенное), извлечение постоянных сущностей из базы данных и управление границами транзакций. Сессия предназначена для существования на протяжении всей логической транзакции в базе данных. В связи с этим, реализации сессии не должны быть потокобезопасными и не предназначены для использования несколькими клиентами.