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

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, который будет связан с созданной таблицей. Связь происходит с помощью аннотаций. Имя этот класс может иметь любое и поля в нем тоже могут иметь любые имена. Нам главное связать класс с таблицей и поля класса с аттрибутами таблицы.

package HibernateApps; import javax.persistence.Column; // Класс, который будет связан с таблицей в БД // Помечается аннотацией @Entity @Entity // Связываем этот класс с таблицей books // Аннотацией @Table. // Передаем в нее имя таблицы. @Table(name = “books”) public class Book { // Свяжем поле id класса с ключевым атрибутом // в таблице. // Для этого для начала помечаем // его аннотацией @Id. @Id // Аннотацией @GeneratedValue можем указать, // каким образом будут генерироваться ключи // в таблице. // identity – значение по умолчанию. // Означает, что мы оставляем генерацию значений // ключей на выбор используемой стратегии. // То есть БД будет автоматически // инкрементировать значение ключа // при вставке новой записи в таблицу. // Также, например, можем создать собственную // стратегию генерации и указать здесь, // но мы оставим identity. @GeneratedValue(strategy = GenerationType.IDENTITY) // С помощью Column связываем поля // класса с соответствующими столбцами таблицы, // передавая в аннотацию имена этих столбцов. @Column(name = “id”) private int id; @Column(name = “name”) private String bookName; public Book() { } public Book(String bookName) { super(); this.bookName = bookName; } // Также обязательно создаем геттеры и сеттеры public int getId() { return id; } public void setId(int id) { this.id = id; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } // И переопределим метод toString, чтобы он // выводил содержимое объекта класса. // Пригодится. @Override public String toString() { return “Book [id=” + id + “, bookName=” + bookName + “]”; } }

Теперь нам нужно настроить подключение Hibernate к maysql и базе данных.

com.mysql.jdbc.Driver jdbc:mysql://localhost/storage org.hibernate.dialect.MySQL8Dialect root 07998MSD org.hibernate.dialect.MySQLDialect thread true true

Теперь собственно перейдем к созданию Hibernate программы. В ней мы просто создаем объект класса Books, сохраняем его в таблицу books в виде строки, потом эту же строку, которую мы туда сохранили извлекаем из таблицы в новый объект.

package HibernateApps; import java.util.List; public class HibernateApp { public static void main(String[] args) { // Объект SessionFactory анализирует конфигурационный // файл, совершает подключение к БД, анализирует классы // с аннотациями и создает объекты Session. // Session объект является оберткой над ОДНИМ // jdbc подключением к базе, то есть можно создать // несколько сессий, а значит несколько подключений. // Этот объект используется для взаимодействия с базой. // Короткоживущий объект создается для каждой транзакции. // То есть создали Сессию -> совершили действия с базой // в пределах транзакции -> закоммитили транзакцию -> // объект сессии умер. // Как видим, мы передаем объекту SessionFactory имя файла // конфигурации и имя класса с аннотациями для связи с БД. SessionFactory sessionfactory = new Configuration() .configure(“hibernate.cfg.xml”) .addAnnotatedClass(Book.class) .buildSessionFactory(); Session session = sessionfactory.getCurrentSession(); try { // Создадим объект класса Book, который // как мы помним, связан с таблицей books // поэтому мы можем добавить этот объект // в эту таблицу как строку таблицы. Book book = new Book(“Harry Potter”); // Выведем на консоль id. Он пока ноль System.out.println(book.toString()); // В Hibernate мы работаем с транзакциями // точнее с последовательностями запросов, // которые можно откатить, поэтому начинаем // транзакцию с помощью beginTransaction. session.beginTransaction(); // Сохраняем объект в таблицу, связанную // с его классом с помощью аннотаций. session.save(book); // Сохраняем изменения в базе с помощью commit. session.getTransaction().commit(); // После коммита id объекта book уже будет // не ноль. После коммита полю объекта book, // помеченному как ключ аннотацией @Id, // присваивается автоинкрементированное // базой значение. System.out.println(book.toString()); // id уже 1 // Новая сессия создается для каждой новой транзакции session = sessionfactory.getCurrentSession(); session.beginTransaction(); // С помощью get можем извлечь объект book // из базы в новый объект. // Передаем в метод get имя класса объекта, // который мы извлекаем, и ключ строки извлекаемого объекта // в таблице. Book harrypotterbook = session.get(Book.class, book.getId()); session.getTransaction().commit(); // Мы извлекли ранее созданный объект book // в новый объект harrypotterbook, значит id // у него тоже будет 1 System.out.println(harrypotterbook.toString()); } catch (Exception e) { // Откатываем изменения в БД // если при транзакции случилась ошибка session.getTransaction().rollback(); e.printStackTrace(); } finally { // По окончании работы с сессией закрываем ее session.close(); } } }

Давайте запустим нашу программу. Для запуска main приложения в eclipse просто достаточно нажать зеленую кнопку в панели сверху.

Первая строка это первый вывод на консоль в программе с помощью ToString. Как уже было сказано, id у объекта пока ноль.

Далее insert запросом происходит добавление объекта в базу.

Второй вывод на консоль содержимого объекта показывает, что после вызова save над объектом, который мы сохраняли в БД, поле id этого объекта теперь имеет значение. То есть метод save записал в поле id объекта book значение.

Далее происходит запрос на выборку только что добавленной строки в таблицу в новый объект.

В последнем выводе на консоль видим, что мы успешно извлекли из таблицы ее строку в новый объект содержимое, которого мы выводим.

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

Изучите HQL в Hibernate: объектно-ориентированный язык запросов для работы с БД через классы. Примеры запросов, сравнение с SQL и практическое применение в Java-приложениях.

Time to read: 17

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

Обновление данных в Hibernate через изменение объектов и HQL-запросы. Примеры работы с методами update и executeUpdate для модификации записей.

Time to read: 16

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

Удаление данных в Hibernate: методы delete() и HQL-запросы. Практические примеры удаления как отдельных строк, так и групп записей из базы данных.

Time to read: 16