Топ-100Введение в ORM с использованием Hibernate - CodOrbits
LogoCodOrbits

Раздел: Hibernate

Познакомьтесь с Hibernate — ORM-фреймворком Java для удобной работы с базами данных через объекты.

Все разделы
Иконка Hibernate

Введение в ORM с использованием Hibernate

Last updated: 11 мая 2025 г.

Hibernate реализует ORM-модель построения приложений.

Благодаря ORM можно сохранить объект в базу данных.

При сохранении какого-либо объекта в базу данных, объект будет превращен в строку таблицы базы данных.

Значения же полей этого объекта будут значениями аттрибутов этой строки таблицы. То есть поля объекта ассоциированы с аттрибутами таблицы, а класс объекта ассоциирован с конкретной таблицей в БД.

То есть если, например, есть класс "Пользователь" с определенными полями – имя, фамилия, возраст и мы хотим поместить объект этого класса в БД, то там должна быть соответствующая этому классу таблица с аттрибутами имя, фамилия, возраст, в которой и будут храниться объекты класса "Пользователь".

Search Icon

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

Additional Material Icon
Divider

Оптимизация производительности Hibernate

Additional Material Icon
Divider

Логирование SQL-запросов в Hibernate

Additional Material Icon

Следующие уроки

Обзор языка запросов HQL в Hibernate

17
мин.

Similar Articles Icon
Divider

HQL: обновление данных (Update)

16
мин.

Similar Articles Icon
Divider

HQL: удаление данных (Delete)

16
мин.

Similar Articles Icon