JavaRush /Курсы /Модуль 4. Работа с БД /Конфигурирование Hibernate

Конфигурирование Hibernate

Модуль 4. Работа с БД
9 уровень , 4 лекция
Открыта

5.1 Автоматическое создание схемы данных

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

Первая такая настройка — это параметр hbm2ddl.auto. У нее может быть 5 различных значений:

validate Валидация: Hibernate проверит, совпадают ли имена и типа колонок и полей в базе и в аннотациях. Это самый частый режим.
update Апдейт: Hibernate обновит таблицы в базе, если они или их колонки отличаются от ожидаемых.
create Пересоздание: Hibernate удалит все таблицы в базе и создаст их заново на основе данных из аннотаций.
create-drop Создание-удаление. В начале работы Hibernate создаст все таблицы, в конце работы – удалит их за собой.
none Hibernate вообще ничего не будет делать. Если где-то база не совпадает с ожиданием, то будут сыпаться ошибки во время выполнения запросов.

5.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>

В детали вдаваться не буду, просто хочу, чтобы ты знал, что так можно.

5.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 (any version) org.hibernate.dialect.OracleDialect
Oracle 11g org.hibernate.dialect.Oracle10gDialect

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

Почему важно указывать правильный диалект?

У каждой базы данных типы данных могут немного отличаться. Поэтому чтобы Hibernate прямо идеально работал именно так, как ты от него ожидаешь, нужно указать ему, какой диалект SQL-языка ему нужно использовать.

Вот интересная картинка, которая показывает, как все связано на самом деле:

5.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-сервера, и имя схемы, с которой ты будешь работать.

1
Задача
Модуль 4. Работа с БД, 9 уровень, 4 лекция
Недоступна
task0906
Добавь в метод main код для дополнительной настройки SessionFactory. Укажи диалект "org.hibernate.dialect.MySQL8Dialect" и включи показ выполняемых SQL запросов.
Комментарии (10)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Андрей Уровень 109
29 июня 2024
кто-нибудь понял последнее предложение в лекции?
Ольга Николенко Уровень 109 Expert
25 мая 2024
еще одно место, где можно случайно дропнуть базу Оо
Andrey Vysotsky Уровень 32
16 апреля 2024
О, клссика Джавараш, снова нож в спину. т.е я сначала разобрался сам как чего ставить и что куда прописывать в файле с конфигом, потом прошел прошлую лекцию, а тепер мне рассказывают то, что я сам разобрался. А че например местами не поменять статьи? А блин, кому я это пишу... просто крик отчаяния в небо
Nikolai Уровень 39
16 июня 2024
Хватит ныть, когда выйдешь за пределы джава раша, то ты мягко говоря удивишься что самому надо будет откапывать всю инфу и она 90% - на английском языке с непонятными терминами. Джава раш закончился на многопоточности, дальше сам.
Andrey Vysotsky Уровень 32
18 июня 2024
лол. Ну вышел я за пределы джавараша и сам все ещё. Все ещё считаю, что они хер клали а трети лекций понаписан бессвязный бред, где-то вещи используются раньше чем они водятся. Вот ты мне скажи, в твоем ответе какой смысл? Ну буду(и уже) сам что-то искать. Каким образом это оправдывает то что НА ОБРАЗОВАТЕЛЬНОЙ ПЛАТФОРМЕ ЗА ДЕНЬГИ статьи перепутаны местами? м? Ну каким образом?
Gans Electro Уровень 39
26 июля 2024
Думаю моя статья облегчит вам прохождение. Как пройти JR без боли
ivan Уровень 40
15 марта 2024
парни не забывайте про Preliquibase. и помните что при первом запуске приложения в котором используется хибер и liquibase нельзя ставить:

  jpa:
    hibernate:
      ddl-auto: validate
Михаил Уровень 111 Expert
12 ноября 2023
не забудьте в кавычках "true"
Михаил Уровень 17
5 июня 2023
WARN: MySQL8Dialect has been deprecated; use org.hibernate.dialect.MySQLDialect instead все работает и с 5 и с 8, но в процессе пишет предупреждение, что надо без цифр указывать диалект
Nikolai Уровень 39
16 июня 2024
Это с новых версий не надо цифры указывать. Для старых версий бд всё по-прежнему