Backend
October 11, 2023

Hibernate для новичков: основы работы с объектно-реляционным отображением

Что такое Hibernate и для чего он нужен

Hibernate - это инструмент, который помогает связывать объекты в коде с записями в базе данных. Допустим, у тебя есть класс Пользователь в коде. А в базе данных есть таблица users с полями id, name, email и т.д. Hibernate позволяет автоматически конвертировать объект Пользователь в строку таблицы users и обратно. Таким образом разработчику не нужно писать рутинный код для работы с базой данных - Hibernate все сделает за него.

Зачем это нужно?

Во-первых, это экономит много времени. Представь, что без Hibernate для каждого класса нужно писать код для сохранения в базу, чтения из базы, обновления и удаления. А с Hibernate достаточно только описать связь между классом и таблицей - и все будет работать как надо! А во-вторых, это позволяет абстрагироваться от конкретной базы данных. Ты можешь поменять PostgreSQL на MySQL одной строчкой в конфигурации Hibernate. При этом код программы останется неизменным.

Давай разберем пошагово, как все это работает

Чтобы использовать Hibernate в проекте, нужно выполнить несколько шагов.

  • Добавить зависимость Hibernate в систему сборки проекта (Maven, Gradle и т.д.).
  • Создать файл конфигурации hibernate.cfg.xml. В нем указать данные для подключения к базе данных, диалект SQL и другие параметры.
  • Описать сущности, т.е. классы, соответствующие таблицам в базе данных.

Для этого используются специальные аннотации:

@Entity - помечает класс как сущность Hibernate @Id - помечает поле как первичный ключ @Column - указывает соответствие поля столбцу в таблице базы данных

Например:

@Entity public class User {
@Id @Column(name="id") private int userId;
@Column(name="name") private String username;
@Column(name="email") private String email;
}
  • Создать класс для работы с Hibernate и открыть сессию:
SessionFactory factory = new Configuration().configure().buildSessionFactory(); 
Session session = factory.openSession();

Теперь мы готовы выполнять запросы к базе данных! Рассмотрим основные операции.

Чтобы сохранить объект в базу данных, делаем:

User user = new User(); 
user.setUsername("john");

session.beginTransaction(); 
session.save(user); 
session.getTransaction().commit();

Метод save() автоматически определит, что нужно добавить новую запись в таблицу users.

Для чтения объекта по id:

User user = session.get(User.class, 1);

Это запросит пользователя с id = 1 из базы и конвертирует результат в объект User.

Чтобы обновить объект:

User user = session.get(User.class, 1); 
user.setEmail("newemail@mail.ru");
session.beginTransaction(); 
session.update(user); 
session.getTransaction().commit();

И наконец, чтобы удалить:

User user = session.get(User.class, 1); 
session.beginTransaction(); 
session.delete(user); 
session.getTransaction().commit();

Как видишь, код получается очень простой и понятный без лишней "воды".

Hibernate умеет работать не только с отдельными объектами, но и с их взаимосвязями. Рассмотрим на примерах.

Допустим, у нас есть сущности Пользователь (User) и Заказ (Order). Отношение "один ко многим" - у пользователя может быть несколько заказов.

Для этого нужно:

  • Добавить в класс Пользователь поле списка заказов:
@OneToMany(mappedBy="user") 
private List<Order> orders;
  • В классе Заказ добавить поле ссылки на Пользователя:
@ManyToOne 
@JoinColumn(name="user_id") 
private User user;
  • При работе с объектами устанавливать связи в обе стороны:
User user = session.get(User.class, 1); 
Order order = new Order();

order.setUser(user); 
user.getOrders().add(order);

И все! Hibernate сам сохранит правильные id при записи в базу данных.

Аналогично настраиваются отношения "многие ко многим" и "один к одному".

Главные плюсы Hibernate:

  • Автоматическое сохранение объектов в БД без ручного кода
  • Поддержка связей между объектами
  • Переносимость между разными базами данных
  • Мощный язык запросов HQL
  • Встроенная поддержка кеширования данных

Конечно, чтобы по-настоящему разобраться во всем этом нужно попрактиковаться и изучить побольше теории.