Hibernate配置方式
Hibernate給人的感受是靈活的,要達到同一個目的,我們可以使用幾種不同的辦法。就拿Hibernate配置來說,常用的有如下三種方式,任選其一。
- 在 hibernate.cfg.xml 中加入元素 <property>、<mapping>,放置在類路徑(classpath)的根目錄下。
- 將 hibernate.properties 放置放在類路徑的根目錄下。
- 可編程的配置方式,即在程序中配置Hibernate的啟動參數、加載映射文件,需要用Configuration接口來實現這一方式。
使用hibernate.cfg.xml是我比較喜歡的方式,一方面xml天生的優勢——良好的可讀性,讓配置的意圖一目了然。另一方面這是官方推薦使用的,如果同時在hibernate.cfg.xml和hibernate.properties對Hibernate進行了配置,那么前者將覆蓋后者。
hibernate.properties可以非常的簡潔明了,並且有一種linux配置文件的風格。以#開始一行的注釋,用鍵值對的方式存儲配置參數。
對於這兩種方式,結果都是一樣的。只是看個人喜好。關於配置參數我們稍后討論。
Configuration類
org.hibernate.cfg.Configuration實例的作用是對Hibernate進行配置,以及對它進行啟動。在Hibernate的啟動過程中,Configuration類的實例首先讀取Hibernate配置文件,加載配置信息,然后加載映射文件,創建一個SessionFactory對象。
實例被設計成啟動期間(startup-time)對象,一旦SessionFactory 創建完成它就被丟棄了。
要使用一個Configuration對象,要為它設置兩個方面的內容:
- 數據庫連接屬性
- hbm.xml或pojo類
Configuration常用操作函數
1.加載Hibernate配置文件
Configuration cfg=new Configuration().configure("/etc/hibernate.cfg.xml");
或者
Configuration cfg=new Configuration().configure("/etc/hibernate.properties");
2.為Configuration指定映射文件
cfg.addResource("test/User.hbm.xml");
3.為Configuration指定POJO類,Order.hbm.xml根Order.java一個目錄
cfg.addClass(test.Order.class);
4.為Configuration指定Hibernate配置屬性,當然我們加載了配置文件就不能使用這個方法了。
Configuration cfg = new Configuration() .addClass(test.User.class) .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect") .setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test") .setProperty("hibernate.order_updates", "true");
5.獲得SessionFactory
SessionFactory sessions = cfg.buildSessionFactory();
當所有映射定義被 Configuration 解析后,應用程序必須獲得一個用於構造org.hibernate.Session 實例的工廠SessionFactory。這個工廠將被應用程序的所有線程共享,線程安全的全局對象,只需要被實例化一次。單例模式。
Hibernate 允許你的應用程序創建多個SessionFactory 實例。這對 使用多個數據庫的應用來說很有用。
hibernate.cfg.xml
hibernate.cfg.xml在文檔開頭的DTD(文檔類型定義)是很復雜的。我們並不需要去理會和記憶他。你可以直接copy它。
hibernate.cfg.xml文檔以<hibernate-configuration>為根元素,你可以在其子元素<session-factory>中
- 加入<property>元素來配置各種參數。
- 加入<mapping>加載映射文件,resource代表映射文件的路徑。
一個hibernate.cfg.xml例子:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">klguang@mysql</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">10</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class"> org.hibernate.cache.NoCacheProvider </property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <property name="javax.persistence.validation.mode">none</property> <mapping resource="hbm/User.hbm.xml" /> <mapping resource="hbm/Event.hbm.xml" /> <mapping resource="hbm/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
hibernate.properties
對於hibernate.properties作為配置文件的方式,我是不推薦新手使用的。因為,其可讀性差,另外眾多的配置參數會讓初學者不知道如何下手。
在Hibernate發布包的project/etc/,提供了一個hibernate.properties文件,該文件列出了Hibernate 的所有配置參數,但都是用#注釋掉了。每一行是一個配置參數,以鍵值對的方式存在,空格前是key,空格后是value,我們應該將空格改為等號。
對每一個配置參數,文件里都有詳細的解釋。我們只需要將見面#去掉,並修改其value就可以了。
一個hibernate.properties例子:
#數據庫使用的驅動類 hibernate.connection.driver_class=com.mysql.jdbc.Driver #數據庫連接串 hibernate.connection.url=jdbc:mysql://localhost:3306/db #數據庫連接的用戶名 hibernate.connection.username=user #數據庫連接的密碼 hibernate.connection.password=password #數據庫使用的方言 hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect #是否打印SQL語句 hibernate.show_sql=true javax.persistence.validation.mode=none
hibernate.properties沒有提供加載映射文件的方式。因此需要通過Configuration的.addResource()方法來加載映射文件或POJO類,Hibernate會自動找到另一方,前提映射文件和POJO類在同一包(目錄)中。
Configuration cfg = new Configuration(); cfg.configure("/etc/hibernate.properties"); cfg.addResource("test/User.hbm.xml"); cfg.addClass(test.Order.class);
Hibernate配置參數詳解
Hibernate JDBC 屬性
屬性名 |
用途 |
hibernate.connection.driver_class |
JDBC driver class |
hibernate.connection.url |
JDBC URL |
hibernate.connection.username |
database user |
hibernate.connection.password |
數據庫用戶密碼 |
hibernate.connection.pool_size |
maximum number of pooled connections |
Hibernate 數據源屬性
屬性名 |
用途 |
hibernate.connection.datasource |
數據源 JNDI 名字 |
hibernate.jndi.url JNDI |
提供者的 URL(可選) |
hibernate.jndi.class JNDI |
InitialContextFactory 類(可選) |
hibernate.connection.username |
數據庫用戶(可選) |
hibernate.connection.password |
數據庫密碼(可選) |
可選的配置屬性
有大量屬性能用來控制 Hibernate 在運行期的行為。它們都是可選的,並擁有適當的默認值。
屬性名 |
用途 |
可選值 ()內為默認 |
hibernate.dialect |
允許 Hibernate 針對特定的關系數據庫生成優化的 SQL 的 org.hibernate.dialect.Dialect 的類名。 例如:org.hibernate.dialect.MySQLDialect |
|
hibernate.show_sql |
輸出所有 SQL 語句到控制台。 |
true|false (false) |
hibernate.format_sql |
在 log 和 console 中打印出更漂亮的 SQL。 |
true|false (false) |
hibernate.default_catalog |
在生成的 SQL 中,將給定的 catalog 附加於非全限定名的表名上 |
|
hibernate.session_factory_name |
org.hibernate.SessionFactory 創建后,將自動使用這個名字綁定到 JNDI 中。 |
|
hibernate.max_fetch_depth |
為單向關聯(一對一,多對一)的外連接抓取(outer join fetch)樹設置最大深度。 |
0到3 |
hibernate.default_batch_fetch_size |
為 Hibernate 關聯的批量抓取設置默認數量。 |
4、8、16 |
hibernate.default_entity_mode |
為由這個 SessionFactory 打開的所有 Session指定默認的實體表現模式。 |
dynamic-map,dom4j,pojo |
hibernate.order_updates |
強制 Hibernate 按照被更新數據的主鍵,為SQL 更新排序。這么做將減少在高並發系統中事務的死鎖。 |
true|false
|
hibernate.generate_statistics |
如果開啟,Hibernate 將收集有助於性能調節的統計數據。 |
true|false
|
hibernate.use_identifier_rollback |
如果開啟,在對象被刪除時生成的標識屬性將被重設為默認值。 |
true|false
|
hibernate.use_sql_comments |
如果開啟,Hibernate 將在 SQL 中生成有助於調試的注釋信息,默認值為 false。 |
true|false (false) |
Hibernate JDBC 和連接(connection)屬性、Hibernate 緩存屬性、Hibernate 事務屬性等主要用於提升性能,並且Hibernate有適當的默認值。入門者可以忽略這些設置,等學到一定階段,你可以參考官方文檔進行適當配置。