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 |
---|
|
MySQL 5.0 |
---|
|
PostgreSQL |
---|
|
MySQL 8.0 підтримує більше можливостей, ніж MySQL 5.0, тому якщо ти хочеш, щоб Hibernate використовував їх усі по максимуму, то вказуй правильний діалект.
База даних H2 зазвичай зберігається в пам'яті, тому mem:test
— це і ім'я SQL-сервера, та ім'я схеми, з якою ти працюватимеш.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ