hibernate.cfg.xml 是 Hibernate 核心配置入口,涵蓋資料源、連線池、方言、快取、映射檔引用等所有關鍵設定。本文整理最實用的配置模板與避坑指南。
<?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>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="jdbc.fetch_size">50</property>
<property name="jdbc.batch_size">30</property>
<!-- JNDI DataSource (應用伺服器環境) -->
<property name="connection.datasource">java:comp/env/jdbc/myds</property>
<property name="connection.provider_class">org.hibernate.connection.DatasourceConnectionProvider</property>
<mapping resource="com/example/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/mydb</property>
<property name="connection.username">user</property>
<property name="connection.password">pass</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">1800</property><!-- 秒,閒置回收 -->
<property name="hibernate.c3p0.max_statements">50</property><!-- PreparedStatement 快取 -->
c3p0-0.9.x.jar + mchange-commons-java.jar<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.proxool.pool_alias">pool1</property>
<property name="hibernate.proxool.xml">ProxoolConf.xml</property>
<property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
<proxool>
<alias>pool1</alias>
<driver-url>jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root"/>
<property name="password" value="root"/>
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<maximum-new-connections>20</maximum-new-connections>
<prototype-count>5</prototype-count> <!-- 最小閒置 -->
<maximum-connection-count>100</maximum-connection-count>
<minimum-connection-count>10</minimum-connection-count>
</proxool>
proxool-0.8.3.jar官方宣佈 DBCP 有 Bug (空連線洩漏),Hibernate 3 移除支援。 若舊專案必須用,需自行整合 commons-dbcp + commons-pool,不再贅述。
| 資料庫 | Driver Class | JDBC URL 範例 | 必備 JAR |
|---|---|---|---|
| MySQL | com.mysql.jdbc.Driver | jdbc:mysql://host:3306/db?characterEncoding=utf8 | mysql-connector-java.jar |
| SQL Server (jTDS) | net.sourceforge.jtds.jdbc.Driver | jdbc:jtds:sqlserver://host:1433;DatabaseName=db | jtds.jar |
| Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@host:1521:sid | ojdbc6/8.jar |
| 值 | 行為 | 適用環境 |
|---|---|---|
| validate | 啟動時驗證結構一致性,不修改 | 生產 |
| update | 嘗試更新結構 (僅增欄/表,不刪) | 開發/測試 |
| create | 啟動時 Drop 再 Create | 單元測試 |
| create-drop | 啟動 Create,關閉 SessionFactory 時 Drop | 整合測試 |
connection.provider_class 必須與連線池匹配:C3P0 不用設 (預設)、Proxool 必設、JNDI 必設hibernate. 前綴 (如 hibernate.c3p0.max_size),無前綴相容但可能棄用show_sql=true 僅輸出到 stdout,生產請用 log4j 設定 org.hibernate.SQL=DEBUGresource 為 classpath 相對路徑,file 為檔案系統絕對路徑