本文為 Hibernate 文檔筆記第三部分,系統梳理 hibernate.cfg.xml / hibernate.properties 中所有可選配置屬性,分為五大類:核心配置、JDBC/連接、緩存、事務、雜項。系統級屬性 (標註 *) 僅能通過 -Dproperty=value 或 hibernate.properties 設置。
| 屬性名 | 說明 | 取值範圍/建議 |
|---|---|---|
| hibernate.dialect | 方言類,自動生成優化 SQL | org.hibernate.dialect.* 子類,通常可自動檢測 |
| hibernate.show_sql | 控制台輸出 SQL | true|false (建議生產關閉,改用 Log4j org.hibernate.SQL=DEBUG) |
| hibernate.format_sql | 格式化輸出 SQL | true|false |
| hibernate.default_schema | SQL 中自動加 Schema 前綴 | Schema 名稱 |
| hibernate.default_catalog | SQL 中自動加 Catalog 前綴 | Catalog 名稱 |
| hibernate.session_factory_name | SessionFactory 綁定 JNDI 名 | jndi/sf |
| hibernate.max_fetch_depth | 外連接最大深度 (0 禁用) | 0-3 (建議 0 或 1) |
| hibernate.default_batch_fetch_size | 批量抓取大小 (優化 N+1) | 4, 8, 16 (強烈建議開啟) |
| hibernate.default_entity_mode | 實體表現模式 | pojo|dynamic-map|dom4j |
| hibernate.order_updates | 按主鍵排序 UPDATE 減少死鎖 | true|false (高併發建議 true) |
| hibernate.generate_statistics | 收集性能統計 (SessionFactory.getStatistics()) | true|false |
| hibernate.use_identifier_rollback | 刪除後重置 ID 為默認值 | true|false |
| hibernate.use_sql_comments | SQL 註釋 (利於調試/分析) | true|false (建議開發開啟) |
| 屬性名 | 說明 | 取值/建議 |
|---|---|---|
| hibernate.jdbc.fetch_size | JDBC Statement Fetch Size | 整數 (如 50, 100) |
| hibernate.jdbc.batch_size | JDBC 批量更新大小 (0 禁用) | 5-30 (批量寫入必開) |
| hibernate.jdbc.batch_versioned_data | 批量版本數據返回正確行數 | true|false (默認 false, 通常安全開啟) |
| hibernate.jdbc.factory_class | 自定義 Batcher 工廠 | 類全限定名 (極少用) |
| hibernate.jdbc.use_scrollable_resultset | 使用 JDBC2 可滾動結果集 | true|false (用戶提供連接時需顯式設置) |
| hibernate.jdbc.use_streams_for_binary | 二進制/序列化數據用流讀寫 | true|false (系統級*) |
| hibernate.jdbc.use_get_generated_keys | 用 JDBC3 getGeneratedKeys 回填主鍵 | true|false (需 JDBC3+/JRE1.4+,驅動有 Bug 時關閉) |
| hibernate.connection.provider_class | ConnectionProvider 實現類 | 類名 (如 C3P0/Druid/Hikari 整合類) |
| hibernate.connection.isolation | JDBC 事務隔離級別 | 1(READ_UNCOMMITTED)|2(READ_COMMITTED)|4(REPEATABLE_READ)|8(SERIALIZABLE) |
| hibernate.connection.autocommit | 共享連接自動提交 (不推薦) | true|false |
| hibernate.connection.release_mode | 連接釋放時機 | auto|on_close|after_statement|after_transaction (JTA 建議 after_statement) |
| hibernate.connection.<propertyName> | 透傳 DriverManager.getConnection 參數 | 如 url, user, password |
| hibernate.jndi.<propertyName> | 透傳 JNDI InitialContext 參數 | 如 provider.url, context.factory |
| 屬性名 | 說明 | 取值/建議 |
|---|---|---|
| hibernate.cache.provider_class | CacheProvider 實現 (Ehcache/Infinispan/Redis/Hazelcast) | 類名 |
| hibernate.cache.use_minimal_puts | 優化集群寫入 (多讀少寫) | true|false (集群環境默認 true) |
| hibernate.cache.use_query_cache | 啟用查詢緩存 | true|false (需顯式 setCacheable(true)) |
| hibernate.cache.use_second_level_cache | 啟用二級緩存 (指定 Provider 後默認開啟) | true|false |
| hibernate.cache.query_cache_factory | QueryCache 實現類 | 默認 StandardQueryCache |
| hibernate.cache.region_prefix | 緩存區域名稱前綴 (多 SessionFactory 隔離) | 字符串前綴 |
| hibernate.cache.use_structured_entries | 緩存存儲人性化格式 (利於調試) | true|false |
| 屬性名 | 說明 | 取值/建議 |
|---|---|---|
| hibernate.transaction.factory_class | TransactionFactory 實現 | 默認 JDBCTransactionFactory (JTA 環境用 JTATransactionFactory) |
| hibernate.transaction.manager_lookup_class | TransactionManagerLookup 實現 (JTA 環境必需) | 類名 (如 JBossTransactionManagerLookup) |
| hibernate.transaction.flush_before_completion | 事務完成前自動 flush | true|false (建議由上下文管理器控制) |
| hibernate.transaction.auto_close_session | 事務完成後自動 close session | true|false (建議由上下文管理器控制) |
注意: flush_before_completion / auto_close_session 在使用 CurrentSessionContext (如 thread, jta) 時由上下文管理器優先處理,配置項可能被忽略。
| 屬性名 | 說明 | 取值/建議 |
|---|---|---|
| hibernate.current_session_context_class | 當前 Session 範圍策略 | jta|thread|managed|自定義類 (Spring 整合通常用 SpringSessionContext) |
| hibernate.query.factory_class | HQL 解析器實現 | ASTQueryTranslatorFactory (默認, 高性能) / ClassicQueryTranslatorFactory |
| hibernate.query.substitutions | HQL 標記映射到 SQL 標記 | hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUN |
| hibernate.hbm2ddl.auto | 啟動時 DDL 自動操作 | validate|update|create|create-drop (生產嚴禁 create/create-drop) |
| hibernate.cglib.use_reflection_optimizer * | 用 CGLIB 代替反射優化 (系統級*) | true|false (不可在 cfg.xml 中設置,需 JVM 參數) |
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.format_sql">false</property>
<property name="hibernate.jdbc.batch_size">20</property>
<property name="hibernate.jdbc.batch_versioned_data">true</property>
<property name="hibernate.order_updates">true</property>
<property name="hibernate.default_batch_fetch_size">16</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.ehcache.EhCacheProvider</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_minimal_puts">true</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">validate</property>