標準 hibernate.cfg.xml 範例 (MySQL 5.x/8.x 通用)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"https://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示 SQL,開發階段建議開啟 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- SQL 方言:MySQL 5.7+ 用 MySQL57Dialect,8.0+ 用 MySQL8Dialect -->
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
<!-- 批次抓取 / 批次刪除優化 -->
<property name="jdbc.fetch_size">50</property>
<property name="jdbc.batch_size">30</property>
<!-- 連線資訊 -->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=Asia/Taipei&characterEncoding=utf8</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<!-- 連線池 (生產建議改用 HikariCP) -->
<property name="hibernate.connection.pool_size">10</property>
<!-- 實體映射檔 -->
<mapping resource="com/example/entity/User.hbm.xml"/>
<mapping resource="com/example/entity/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
核心屬性詳細說明
| 屬性 | 說明 | 推薦值/備註 |
dialect | SQL 方言,決定生成的 SQL 語法 | MySQL 5.7: MySQL57Dialect / 8.0: MySQL8Dialect |
connection.driver_class | JDBC 驅動類 | 5.x: com.mysql.jdbc.Driver / 8.x: com.mysql.cj.jdbc.Driver |
connection.url | JDBC URL | 必加 useSSL=false, serverTimezone, characterEncoding=utf8 |
show_sql | 控制台輸出 SQL | 開發 true / 生產 false |
hibernate.hbm2ddl.auto | 啟動時自動建表/更新 | validate / update / create-drop (僅開發/測試) |
jdbc.batch_size | 批次 INSERT/UPDATE/DELETE | 20-50,配合 @DynamicInsert 效果最佳 |
connection.provider_class | 連線池實現 | 生產必改:org.hibernate.hikaricp.internal.HikariCPConnectionProvider |
MySQL 8.0 關鍵遷移點
- 驅動包:
mysql-connector-java-8.x.jar (Maven: mysql:mysql-connector-java:8.0.x)
- 驅動類:
com.mysql.cj.jdbc.Driver (舊 com.mysql.jdbc.Driver 已棄用)
- URL 參數:
useSSL=false (預設 true 會警告)、serverTimezone=Asia/Taipei (避免時區解析錯誤)
- 方言:
MySQL8Dialect 支援 CTE、窗口函數、JSON 函數下推
- 認證插件:預設
caching_sha2_password,舊客戶端需在 URL 加 allowPublicKeyRetrieval=true 或用戶改 mysql_native_password
依賴管理
<!-- Maven 範例 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.15.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- 生產連線池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
常見坑位速查
| 現象 | 原因 | 解決 |
| Communications link failure | MySQL 8 服務端預設需 SSL | URL 加 useSSL=false 或配置 SSL 憑證 |
| CST timezone unknown | JVM 時區與 MySQL 不匹配 | URL 加 serverTimezone=Asia/Taipei |
| Public Key Retrieval is not allowed | caching_sha2_password 握手失敗 | URL 加 allowPublicKeyRetrieval=true 或改用 native_password |
Table 'xxx' doesn't existhbm2ddl.auto 未建表 | 開發用 update,生產用 Flyway/Liquibase 遷移 |