1. Автоматичне створення схеми даних

Під час стартового конфігурування Hibernate можна увімкнути дуже багато цікавих налаштувань. Я не став їх наводити раніше, щоб не розпорошуватися. А ось наприкінці рівня, думаю, про деякі з них все ж розповісти.

Перше таке налаштування — це hbm2ddl.auto. Воно може мати 5 різних значень:

validate Валідація: Hibernate перевірить, чи збігаються імена і типи колонок та полів у базі та в анотаціях. Це найчастіший режим.
update Апдейт: Hibernate оновить таблиці в базі, якщо вони або їх колонки відрізняються від очікуваних.
create Перетворення: Hibernate видалить всі таблиці в базі та створить їх наново на основі даних з анотацій.
create-drop Створення-видалення. На початку роботи Hibernate створить усі таблиці, наприкінці роботи — видалить їх за собою.
none Hibernate взагалі нічого не робитиме. Якщо база не збігається з очікуванням, то сипатимуться помилки під час виконання запитів.

2. Логування запитів

Друге дуже корисне налаштування Hibernate — це логування всіх його запитів до бази: всі запити до бази дублюються в консолі. Це дуже корисна функція, якщо ти вносиш зміни до коду, пов'язаного з Hibernate.

По-перше, ти краще зрозумієш, як твої запити перетворюються на SQL. По-друге, легше і раніше зможеш знаходити помилки. А вони точно будуть. Не завжди Hibernate працює так, як ми очікуємо. Особливо це пов'язано з анотаціями: ти розумієш по-своєму, а Hibernate — по-своєму.

Налаштування, що включає логування, називається hibernate.show_sql. Якщо виставити її значення до true, в консолі будуть писатися запити до бази. Також у парі з ним використовується параметр hibernate.format_sql, який дозволяє встановити зручний формат SQL-запиту в лозі.

Ще один спосіб логувати запити до бази — це використовувати стандартний логер. Справа в тому, що Hibernate і так пише свої запити до стандартного логера, але лише з областю видимості — DEBUG. Тобі потрібно змінити дві властивості у своєму стандартному логері:


logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace

Зміна ж рівня BasicBinder на trace додасть нам параметри запитів, щоправда, у трохи незвичній формі — почергове перерахування після самого запиту.

Третій підхід: використання спеціального proxy-драйвера до бази даних.

Наприклад, log4jdbc або p6spy. Обидва проксі робочі, і на них є стартери, хоча на log4jdbc давно не було коммітів на момент написання статті.


<dependency>
    <groupId>com.integralblue</groupId>
    <artifactId>log4jdbc-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
</dependency>

Занурюватися в подробиці не буду: просто хочу, щоб тобі було відомо, що так можна.

3. Діалекти SQL

І ще трохи довідкової інформації.

Hibernate підтримує роботу з дуже великою кількістю СУБД. Кожна з них реалізує стандартний набір функцій SQL та ще якісь свої. Або різні версії SQL. Тому для роботи з цими СУБД потрібно сказати Hibernate, який діалект мови SQL використовувати.

Ось список найбільш популярних діалектів:

PostgreSQL org.hibernate.dialect.PostgreSQLDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Sybase org.hibernate.dialect.SybaseDialect
Informix org.hibernate.dialect.InformixDialect
Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect
MySQL org.hibernate.dialect.MySQLDialect
Oracle (будь-яка версія) org.hibernate.dialect.OracleDialect
Oracle 11g org.hibernate.dialect.Oracle10gDialect

Звісно, таких діалектів може бути скільки завгодно. Ти можеш написати свою СУБД та свій власний діалект до неї.

Чому важливо вказувати правильний діалект?

У кожній базі даних типи даних можуть відрізнятися. Тому щоб Hibernate ідеально працював саме так, як ти від нього очікуєш, потрібно вказати йому, який діалект SQL-мови потрібно використовувати.

Ось цікава картинка, яка показує, як все пов'язано насправді:

4. Популярні налаштування

Щоб спростити тобі життя, наведу повний список кількох налаштувань:

MySQL 8.0
hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
hibernate.connection.driver_class=com.mysql.cj.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/test
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=validate
MySQL 5.0
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/test
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=validate
PostgreSQL
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class= org.postgresql.Driver
hibernate.connection.url= jdbc:postgresql://localhost/test
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=validate

MySQL 8.0 підтримує більше можливостей, ніж MySQL 5.0, тому якщо ти хочеш, щоб Hibernate використовував їх усі по максимуму, то вказуй правильний діалект.

База даних H2 зазвичай зберігається в пам'яті, тому mem:test — це і ім'я SQL-сервера, та ім'я схеми, з якою ти працюватимеш.