5.1 自動數據模式生成

當您第一次配置 Hibernate 時,您可以啟用許多有趣的設置。之前沒帶,免得噴了。但在關卡結束時,我想到了其中的一些內容。

第一個這樣的設置是hbm2ddl.auto. 它可以有 5 個不同的值:

證實 驗證:Hibernate 將檢查列名和字段名以及類型在數據庫和註釋中是否匹配。這是最常見的模式。
更新 更新:如果表或它們的列與預期不同,Hibernate 將更新數據庫中的表。
創造 重新創建:Hibernate 將刪除數據庫中的所有表,並根據註釋中的數據重新創建它們。
創建下降 創建刪除。在工作開始時,Hibernate 將創建所有表,在工作結束時,它會自行刪除它們。
沒有任何 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將向我們添加查詢參數,但是,以一種稍微不尋常的形式 - 在查詢本身之後的順序枚舉。

第三種方法是為數據庫使用一個特殊的代理驅動程序

例如,log4jdbcp6spy。兩個代理都在工作並且有啟動器,儘管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 支持大量的 DBMS。它們中的每一個都實現了一組標準的 SQL 函數和一些它們自己的函數。或者不同版本的 SQL。因此,要使用這些 DBMS,您需要告訴 Hibernate 使用 SQL 語言的哪種方言。

以下是最流行的方言列表:

數據庫 org.hibernate.dialect.PostgreSQL方言
SAP數據庫 org.hibernate.dialect.SAPDB方言
數據庫 org.hibernate.dialect.SybaseDialect
英飛凌 org.hibernate.dialect.InformixDialect
微軟 SQL Server 2008 org.hibernate.dialect.SQLServer2008方言
MySQL org.hibernate.dialect.MySQLDialect
甲骨文(任何版本) org.hibernate.dialect.Oracle方言
甲骨文 11g org.hibernate.dialect.Oracle10g方言

當然,可以有任意數量的這樣的方言。您可以為它編寫自己的 DBMS 和自己的方言。

為什麼指定正確的方言很重要?

每個數據庫的數據類型可能略有不同。因此,為了讓 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
數據庫
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:testSQL 服務器的名稱和您將使用的模式的名稱也是如此。