Hibernate

Проработать

  1. Основы Hibernate
  2. Spring Data JPA
  3. Шпаргалка Java программиста 1: JPA и Hibernate в вопросах и ответах
  4. Ваше первое приложение на Hibernate
  5. Выборка данных с ORM — это просто! Или нет?
  6. 02-Hibernate. Hibernate
  7. Простейший пример Hibernate ORM в Java
  8. JPA : Знакомство с технологией
  9. Собеседование по Java EE — Hibernate Framework (вопросы и ответы). Часть 1
  10. Проблема с N+1 запросами в JPA и Hibernate
  11. Вячеслав Круглов — Введение в Hibernate: что, зачем, и где стандартные ловушки
  12. Изучите Hibernate на практике [GeekBrains]
  13. 60 вопросов и ответов на собеседование по Hibernate (все 4 части в одном видео)
  14. CrudRepository, JpaRepository, and PagingAndSortingRepository in Spring Data
  15. Проблема N+1 и как её решить с помощью EntityGraph
  16. Стратегії створення таблиць | JavalinUa | Java | Hibernate | PostgreSQL

Что это

Hibernate - библиотека предназначенная для решения задач объектно-реляционного отображения (ORM), самая популярная реализация спецификации JPA. Объектно-реляционная модель описывает отношения между программными объектами и записями в БД.

Основные разделы

Слои взаимодействия

  1. Application
  2. Spring Data JPA(Repository) - это механизм организации репозиториев, а репозиторий - это абстракция, лежащая на уровень выше ORM.
  3. Java Persistence API(JPA) — спецификация API Java EE, предоставляет возможность сохранять в удобном виде Java-объекты в базе данных. Имеет только интерфейс. Как реализация чаще всего используется Hibernate.
  4. Hibernate
  5. JDBC
  6. Relational Database

Минусы

  1. Необходимо отслеживать проблему "N + 1"

Проблема N + 1 в JPA - возникает, когда мы генерируем запрос на получение одной сущности из базы данных, но у данной сущности есть свои связанные сущности, которые мы тоже хотим получить и hibernate генерирует вначале один (1) запрос к базе данных, чтобы получить интересующую нас сущность, а потом N запросов, чтобы достать из базы данных связанные сущности.

Java Persistence Query Language (JPQL)

JPQL - платформенно-независимый объектно-ориентированный язык запросов, являющийся частью спецификации Java Persistence API (JPA). JPQL используется для написания запросов к сущностям, хранящимся в реляционной базе данных.

Spring конфигурация application.properties

Аннотации для управления

  1. @Entity(name = "") - указывает что данный класс является сущностью(entity bean). Такой класс должен:
    • Иметь конструктор по-умолчанию (пустой конструктор) public или protected.
    • Не может быть final и не может содержать final-полей/свойств;
    • Должен содержать хотя бы одно @Id-поле.
    • Не может быть вложенным, интерфейсом или enum
  2. @Table(name = "") - указывает с какой именно таблицей необходимо связать (map) данный класс. Имеет различные аттрибуты для указания имя таблицы, каталог, БД и уникальность столбцов в таблице БД.
  3. @Id - указывает первичный ключ (Primary Key) данного класса.
  4. @GeneratedValue - Эта аннотация используется вместе с аннотацией @Id и определяет такие параметры, как strategy и generator.
  5. @Column - определяет к какому столбцу в таблице БД относится конкретное поле класса. Аттрибуты: name, unique, nullable, length.
  6. @Access - определяет режим доступа к полям. Мы можем использовать @Access на уровне класса, поля или метода. Мы можем даже смешивать два типа в одном классе сущностей. По умолчанию тип доступа определяется местом, в котором находится ваш идентификатор(@ Id). Если он будет в поле - это будет AccessType.FIELD, если он будет в геттере - это AccessType.PROPERTY. Иногда вам может потребоваться аннотировать не поля, а свойства (например, потому что вы хотите иметь какую-то произвольную логику в геттере или потому, что вы так предпочитаете). В такой ситуации вы должны определить геттер и аннотировать его как AccessType.PROPERTY.
    • AccessType.FIELD - обычный доступа к полю.
    • AccessType.PROPERTY - для доступа к полю через get/set.

Отношения между таблицами

Дополняется CascadeType, FetchType и др.

    • @OneToOne - рекомендуется EAGER.
    • @OneToMany - рекомендуется LAZY.
    • @ManyToOne - рекомендуется EAGER.
    • @ManyToMany - рекомендуется LAZY.

CascadeType

  1. CascadeType.ALL - необходимо выполнять каскадно сразу все операции.
  2. CascadeType.PERSIST - когда выполняется метод save().
  3. CascadeType.MERGE
  4. CascadeType.REMOVE
  5. CascadeType.REFRESH
  6. CascadeType.DETACH

JPA имеет 2 типа загрузки(FetchType)

  1. LAZY(by default) - ORM загрузит сущность или коллекцию отложено, при первом обращении к ней из кода.
  2. EAGER - заставляет ORM загружать связанные сущности и коллекции сразу, вместе с корневой сущностью.

Состояние Entity:

  1. New
  2. Managed
  3. Removed
  4. Detached

Session methods