Hibernate給人的感覺是靈活的,要達到同一個目的,咱們可使用幾種不一樣的辦法。就拿Hibernate配置來講,經常使用的有以下三種方式,任選其一。 java
使用hibernate.cfg.xml是我比較喜歡的方式,一方面xml天生的優點——良好的可讀性,讓配置的意圖一目瞭然。另外一方面這是官方推薦使用的,若是同時在hibernate.cfg.xml和hibernate.properties對Hibernate進行了配置,那麼前者將覆蓋後者。 mysql
hibernate.properties能夠很是的簡潔明瞭,而且有一種linux配置文件的風格。以#開始一行的註釋,用鍵值對的方式存儲配置參數。 linux
對於這兩種方式,結果都是同樣的。只是看我的喜愛。關於配置參數咱們稍後討論。 sql
org.hibernate.cfg.Configuration實例的做用是對Hibernate進行配置,以及對它進行啓動。在Hibernate的啓動過程當中,Configuration類的實例首先讀取Hibernate配置文件,加載配置信息,而後加載映射文件,建立一個SessionFactory對象。 數據庫
實例被設計成啓動期間(startup-time)對象,一旦SessionFactory 建立完成它就被丟棄了。 編程
要使用一個Configuration對象,要爲它設置兩個方面的內容: 緩存
Configuration經常使用操做函數 安全
1.加載Hibernate配置文件session
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在文檔開頭的DTD(文檔類型定義)是很複雜的。咱們並不須要去理會和記憶他。你能夠直接copy它。
hibernate.cfg.xml文檔以<hibernate-configuration>爲根元素,你能夠在其子元素<session-factory>中
一個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發佈包的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 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有適當的默認值。入門者能夠忽略這些設置,等學到必定階段,你能夠參考官方文檔進行適當配置。