Введение в ORM с использованием Hibernate
Last updated: 11 мая 2025 г.Hibernate реализует ORM-модель
построения приложений.
Благодаря ORM можно сохранить объект в базу данных.
При сохранении какого-либо объекта в базу данных, объект будет превращен в строку таблицы базы данных.
Значения же полей этого объекта будут значениями аттрибутов этой строки таблицы. То есть поля объекта ассоциированы с аттрибутами таблицы, а класс объекта ассоциирован с конкретной таблицей в БД.
То есть если, например, есть класс "Пользователь"
с определенными полями – имя, фамилия, возраст и мы хотим поместить объект этого класса в БД, то там должна быть соответствующая этому классу таблица с аттрибутами имя, фамилия, возраст, в которой и будут храниться объекты класса "Пользователь"
.
Hibernate также помогает сократить много jdbc кода (внутри Hibernate выполняется весь jdbc код, который нам пришлось бы писать) и избавиться от low-level SQL запросов.
Создание Hibernate проекта
Для начала необходимо скачать Hibernate ORM.
Это можно сделать по ссылке https://hibernate.org/orm/releases/5.6/.
Ищем версию 5.6.5 и скачиваем.
Также необходимо скачать файлики dom4j-2.1.3.jar
и mysql-connector-j-8.0.32.jar
. Их можно скачать на mavenrepository.com.
Далее создаем обычный Java проект с main. Для того чтобы демонстрировать азы Hibernate простого main проекта будет достаточно.
Чтобы создать проект для начала сменим режим нашей ide, для этого переходим Window -> Perspective -> Open Perspective -> Other -> Java.
Теперь создаем проект. Создается он по пути File -> New -> Java Project. Даем имя проекту и нажимаем Finish.
Теперь в созданном проекте создаем папку lib
и закидываем в нее все файлы из папки required в архиве Hibernate Orm. Также закидываем туда другие два jar, которые были скачаны отдельно.
Теперь необходимо вручную добавить их в classpath
. Для этого кликаем правой кнопкой мыши по проекту и выбираем -> properties -> Java Build Path -> Add Jars и выбираем все jar файлы в папке lib. Теперь можем писать код.
Структура проекта такая:

Как видим, в проект также были добавлены три файлика. Их разберем далее.
Работа с Hibernate
Давайте для начала sql запросом создадим простую таблицу "books"
с одним аттрибутом "name"
. Ну и аттрибутом id
само собой.

Мы создали таблицу. Теперь давайте же создадим класс Books
, который будет связан с созданной таблицей. Связь происходит с помощью аннотаций. Имя этот класс может иметь любое и поля в нем тоже могут иметь любые имена. Нам главное связать класс с таблицей и поля класса с аттрибутами таблицы.
1package HibernateApps;
2
3import javax.persistence.Column;
4
5// Класс, который будет связан с таблицей в БД
6// Помечается аннотацией @Entity
7@Entity
8// Связываем этот класс с таблицей books
9// Аннотацией @Table.
10// Передаем в нее имя таблицы.
11@Table(name = "books")
12public class Book {
13
14 // Свяжем поле id класса с ключевым атрибутом
15 // в таблице.
16
17 // Для этого для начала помечаем
18 // его аннотацией @Id.
19 @Id
20 // Аннотацией @GeneratedValue можем указать,
21 // каким образом будут генерироваться ключи
22 // в таблице.
23 // identity – значение по умолчанию.
24 // Означает, что мы оставляем генерацию значений
25 // ключей на выбор используемой стратегии.
26 // То есть БД будет автоматически
27 // инкрементировать значение ключа
28 // при вставке новой записи в таблицу.
29 // Также, например, можем создать собственную
30 // стратегию генерации и указать здесь,
31 // но мы оставим identity.
32 @GeneratedValue(strategy = GenerationType.IDENTITY)
33 // С помощью Column связываем поля
34 // класса с соответствующими столбцами таблицы,
35 // передавая в аннотацию имена этих столбцов.
36 @Column(name = "id")
37 private int id;
38
39 @Column(name = "name")
40 private String bookName;
41
42 public Book() {
43 }
44
45 public Book(String bookName) {
46 super();
47 this.bookName = bookName;
48 }
49
50 // Также обязательно создаем геттеры и сеттеры
51 public int getId() {
52 return id;
53 }
54
55 public void setId(int id) {
56 this.id = id;
57 }
58
59 public String getBookName() {
60 return bookName;
61 }
62
63 public void setBookName(String bookName) {
64 this.bookName = bookName;
65 }
66
67 // И переопределим метод toString, чтобы он
68 // выводил содержимое объекта класса.
69 // Пригодится.
70 @Override
71 public String toString() {
72 return "Book [id=" + id + ", bookName=" + bookName + "]";
73 }
74}
Теперь нам нужно настроить подключение Hibernate к maysql и базе данных.
1<!--/Hibernate/Hibernate Configuration DTD 3.0//EN (doctype)-->
2<?xml version="1.0" encoding="UTF-8"?>
3<!DOCTYPE hibernate-configuration PUBLIC
4 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
5 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
6
7<!-- Конфигурация подключения к бд.
8Помним что в курсе по jdbc мы настраивали то
9же самое - драйвер, имя базы с которой будем
10работать, имя от mysql, пароль от mysql
11только в случае с JDBC это делалось прямо
12в классе, а здесь все настройки вынесены
13в отдельный конфигурационный файл. -->
14<hibernate-configuration>
15 <session-factory>
16 <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
17 <property name="connection.url">jdbc:mysql://localhost/storage</property>
18 <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
19 <property name="connection.username">root</property>
20 <property name="connection.password">07998MSD</property>
21 <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
22 <property name="hibernate.current_session_context_class">thread</property>
23 <!-- Также двумя настройками ниже сделаем так чтобы Hibernate показывал
24 в консоли sql запросы которые он выполняет за кулисами. -->
25 <property name="show_sql">true</property>
26 <property name="format_sql">true</property>
27 </session-factory>
28</hibernate-configuration>
Теперь собственно перейдем к созданию Hibernate программы. В ней мы просто создаем объект класса Books
, сохраняем его в таблицу books
в виде строки, потом эту же строку, которую мы туда сохранили извлекаем из таблицы в новый объект.
1package HibernateApps;
2
3import java.util.List;
4
5public class HibernateApp {
6
7 public static void main(String[] args) {
8 // Объект SessionFactory анализирует конфигурационный
9 // файл, совершает подключение к БД, анализирует классы
10 // с аннотациями и создает объекты Session.
11 // Session объект является оберткой над ОДНИМ
12 // jdbc подключением к базе, то есть можно создать
13 // несколько сессий, а значит несколько подключений.
14 // Этот объект используется для взаимодействия с базой.
15 // Короткоживущий объект создается для каждой транзакции.
16 // То есть создали Сессию -> совершили действия с базой
17 // в пределах транзакции -> закоммитили транзакцию ->
18 // объект сессии умер.
19 // Как видим, мы передаем объекту SessionFactory имя файла
20 // конфигурации и имя класса с аннотациями для связи с БД.
21 SessionFactory sessionfactory = new Configuration()
22 .configure("hibernate.cfg.xml")
23 .addAnnotatedClass(Book.class)
24 .buildSessionFactory();
25 Session session = sessionfactory.getCurrentSession();
26
27 try {
28 // Создадим объект класса Book, который
29 // как мы помним, связан с таблицей books
30 // поэтому мы можем добавить этот объект
31 // в эту таблицу как строку таблицы.
32 Book book = new Book("Harry Potter");
33
34 // Выведем на консоль id. Он пока ноль
35 System.out.println(book.toString());
36
37 // В Hibernate мы работаем с транзакциями
38 // точнее с последовательностями запросов,
39 // которые можно откатить, поэтому начинаем
40 // транзакцию с помощью beginTransaction.
41 session.beginTransaction();
42
43 // Сохраняем объект в таблицу, связанную
44 // с его классом с помощью аннотаций.
45 session.save(book);
46
47 // Сохраняем изменения в базе с помощью commit.
48 session.getTransaction().commit();
49
50 // После коммита id объекта book уже будет
51 // не ноль. После коммита полю объекта book,
52 // помеченному как ключ аннотацией @Id,
53 // присваивается автоинкрементированное
54 // базой значение.
55 System.out.println(book.toString()); // id уже 1
56
57 // Новая сессия создается для каждой новой транзакции
58 session = sessionfactory.getCurrentSession();
59 session.beginTransaction();
60
61 // С помощью get можем извлечь объект book
62 // из базы в новый объект.
63 // Передаем в метод get имя класса объекта,
64 // который мы извлекаем, и ключ строки извлекаемого объекта
65 // в таблице.
66 Book harrypotterbook = session.get(Book.class, book.getId());
67 session.getTransaction().commit();
68
69 // Мы извлекли ранее созданный объект book
70 // в новый объект harrypotterbook, значит id
71 // у него тоже будет 1
72 System.out.println(harrypotterbook.toString());
73
74 } catch (Exception e) {
75 // Откатываем изменения в БД
76 // если при транзакции случилась ошибка
77 session.getTransaction().rollback();
78 e.printStackTrace();
79
80 } finally {
81 // По окончании работы с сессией закрываем ее
82 session.close();
83 }
84 }
85}
Давайте запустим нашу программу. Для запуска main приложения в eclipse просто достаточно нажать зеленую кнопку в панели сверху.

Первая строка это первый вывод на консоль в программе с помощью ToString
. Как уже было сказано, id у объекта пока ноль.
Далее insert
запросом происходит добавление объекта в базу.
Второй вывод на консоль содержимого объекта показывает, что после вызова save
над объектом, который мы сохраняли в БД, поле id этого объекта теперь имеет значение. То есть метод save
записал в поле id объекта book значение.
Далее происходит запрос на выборку только что добавленной строки в таблицу в новый объект.
В последнем выводе на консоль видим, что мы успешно извлекли из таблицы ее строку в новый объект содержимое, которого мы выводим.
Дополнительные материалы
Официальная документация Hibernate
Оптимизация производительности Hibernate
Логирование SQL-запросов в Hibernate
Следующие уроки
Обзор языка запросов HQL в Hibernate
17
мин.
HQL: обновление данных (Update)
16
мин.
HQL: удаление данных (Delete)
16
мин.