5.1 Automatyczne generowanie schematu danych

Kiedy po raz pierwszy konfigurujesz Hibernate, możesz włączyć wiele interesujących ustawień. Nie przyniosłem ich wcześniej, żeby nie pryskać. Ale pod koniec poziomu myślę o niektórych z nich do opowiedzenia.

Pierwszym takim ustawieniem jest hbm2ddl.auto. Może mieć 5 różnych wartości:

uprawomocnić Sprawdzanie poprawności: Hibernate sprawdzi, czy nazwy i typy kolumn i pól są zgodne w bazie danych i adnotacjach. Jest to najczęstszy tryb.
aktualizacja Aktualizacja: Hibernate zaktualizuje tabele w bazie danych, jeśli one lub ich kolumny są inne niż oczekiwano.
tworzyć Odtwórz: Hibernate usunie wszystkie tabele z bazy danych i utworzy je ponownie na podstawie danych z adnotacji.
utwórz-upuść Tworzenie-usuwanie. Na początku pracy Hibernate utworzy wszystkie tabele, na końcu pracy usunie je po sobie.
nic Hibernate nic nie da. Jeśli gdzieś baza nie będzie odpowiadała oczekiwaniom, to podczas wykonywania zapytań zostaną wyrzucone błędy.

5.2 Żądania logowania

Drugim bardzo przydatnym ustawieniem Hibernate jest rejestrowanie wszystkich jego żądań do bazy danych: wszystkie żądania do bazy danych są duplikowane w konsoli. Jest to bardzo przydatna funkcja, jeśli wprowadzasz zmiany w kodzie związanym z Hibernate.

Po pierwsze, lepiej zrozumiesz, w jaki sposób Twoje zapytania są konwertowane na SQL. Po drugie, jest łatwiej i wcześniej będziesz mógł znaleźć błędy. I na pewno będą. Hibernacja nie zawsze działa tak, jak byśmy tego oczekiwali. Szczególnie często wiąże się to z adnotacjami: rozumiesz je na swój sposób, a Hibernate na swój sposób.

Ustawienie, które umożliwia rejestrowanie, nazywa się hibernate.show_sql. Jeśli ustawisz jego wartość na true, zapytania do bazy danych będą zapisywane w konsoli. Parametr jest również używany w połączeniu z nim hibernate.format_sql, co pozwala na ustawienie wygodnego formatu zapytania SQL w logu.

Innym sposobem rejestrowania żądań w bazie danych jest użycie standardowego rejestratora . Wszystko poskutkowało tym, że Hibernate zapisuje już swoje zapytania do standardowego loggera, ale tylko z zakresem - DEBUG. Musisz zmienić dwie właściwości w swoim standardowym rejestratorze:

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

Zmiana poziomu BasicBinder na tracedoda nam parametry zapytania jednak w nieco nietypowej formie - sekwencyjnego wyliczania po samym zapytaniu.

Trzecie podejście polega na użyciu specjalnego sterownika proxy dla bazy danych .

Na przykład log4jdbclub p6spy. Oba serwery proxy działają i mają startery, chociaż log4jdbcw chwili pisania tego tekstu nie było żadnych zatwierdzeń.


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

Nie będę wchodził w szczegóły, chcę tylko, żebyś wiedział, że jest to możliwe.

5.3 Dialekty SQL

I jeszcze kilka podstawowych informacji.

Hibernate obsługuje bardzo dużą liczbę systemów DBMS. Każdy z nich implementuje standardowy zestaw funkcji SQL i kilka własnych. Lub różne wersje SQL. Dlatego, aby pracować z tymi DBMS, musisz powiedzieć Hibernate, którego dialektu języka SQL ma używać.

Oto lista najpopularniejszych dialektów:

PostgreSQL org.hibernate.dialect.PostgreSQLDialect
Baza danych SAP org.hibernate.dialect.SAPDBDialect
Sybase org.hibernate.dialect.SybaseDialect
Informix org.hibernate.dialect.InformixDialect
Serwer Microsoft SQL 2008 org.hibernate.dialect.SQLServer2008Dialect
MySQL org.hibernate.dialect.MySQLDialect
Oracle (dowolna wersja) org.hibernate.dialect.OracleDialect
Wyrocznia 11g org.hibernate.dialect.Oracle10gDialect

Oczywiście takich dialektów może być dowolna liczba. Możesz napisać dla niego własny DBMS i własny dialekt.

Dlaczego ważne jest, aby określić właściwy dialekt?

Każda baza danych może mieć nieco inne typy danych. Dlatego, aby Hibernate działał idealnie dokładnie tak, jak tego oczekujesz, musisz powiedzieć mu, jakiego dialektu języka SQL ma używać.

Oto ciekawy obraz, który pokazuje, jak wszystko jest połączone w rzeczywistości:

5.4 Popularne ustawienia

Aby ułatwić Ci życie, oto pełna lista kilku ustawień:

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 obsługuje więcej funkcji niż MySQL 5.0, więc jeśli chcesz, aby Hibernate maksymalnie je wszystkie wykorzystał, określ właściwy dialekt.

Baza danych H2 jest zwykle przechowywana w pamięci, podobnie jak mem:testnazwa serwera SQL i nazwa schematu, z którym będziesz pracować.