強人Hibernate文檔筆記(中)

作者: jonsion  來源: javaEye  發布時間: 2010-09-25 14:19  閱讀: 1503 次  推薦: 0   原文鏈接   [收藏]  

Hibernate文檔筆記共分為三個部分,此處是第二部分,講述了Contextual Sessions、Configuration、獲取SessionFactory和JDBC Connections(Session是對JDBC連接的封裝)。

五、Contextual Sessions

  許多應用程序需要一種和上下文有關聯Hibernate session,這樣的session是指貫穿于給定環境的上下文中都有效的session。無論如何,貫穿于應用程序應用上下文由什么組成的清晰度不同,不同的上下文針對當前的概念有不同的范圍。使用Hibernate 3.0以前版本的應用程序,趨于使用自已實現的基于ThreadLocal來維護前后關系的session、諸如HibernateUtil的幫助類;或使用基于代理或攔截機制的第三方的框架(Spring或Pico)。

  從Hibernate 3.0.1,Hibernate加入了SessionFactory.getCurrentSession()方法。最初,假定使用JTA事務定義了當前session的scope和context。Hibernate團隊維護時,給定了成熟的卓越的JTA TransactionManager的實現方式,多數(但不是所有)應用程序應該使JTA transaction management,不論它是否發布到一個JEE容器中。基于這一點,基于用JTA來維護上下文關系中的session應該是必須的。無論如何,在Hibernate 3.1, SessionFactory. getCurrentSession()之后的處理,是可以被插拔的,也就是說可以session的范圍和上下文。新擴展接口(org.hibernate.context.CurrentSessionContext)和新的配置參數(hibernate.current_session_context_class)被加入,允許插拔,也就是說可以定義session的范圍和上下文。

  細節可以查看org.hibernate.context.CurrentSessionContext的文檔。它定義了一個currentSession()方法,負責跟蹤與當前上下文相關聯的session。Hibernate提供了這個接口的三種實現方式。 

  1. org.hibernate.context.JTASessionContext

  當前session,通過JTA事務跟蹤和標識生命周期。這里的處理過程在處理方法上和老JTA是相似的。

  2. org.hibernate.context.ThreadLocalSessionContext

  當前session,通過當前執行的線程來跟蹤。

  3.org.hibernate.context.ManagedSessionContext

  當前session,通過當前執行的線程來跟蹤。你是負責綁定和解除當前session到執行線程通過使用這個類的靜態方法。該類不會open、flush、close session。

  前兩個實現類,提供了“一個session對應一個數據庫事務”的編程模式,也就是眾所周知的“session-per-request”模式。Hibernate session的開始和結束,是以數據庫中事務的執行時間為依據的。如果你使用編程方式劃分事務,用簡單的JSE需不是JTA,你應該考慮使用Hibernate事務APIs來隱藏低層的事務代碼。如果你使用的是JTA,使用JTA的接口來劃分事務。如果你在一個支持CMT(Container Management Transaction)的容器運行程序,事務是通過聲明定義,在你程序中不需要任何的代碼來劃分事務。

  Hibernate.current_session_context_class參數應該指定,一個org.hibernate.context.CurrentSessionContext的實現類。如果配置參數沒有被設置,而是配置了一個org. hibernate. transaction. TransactionManagerLookup被設置,Hibernate將使用org.hibernate.context.JTASessionContext,這里要考慮向后兼容。典型的情況下,這個參數是使用的類的名字。對于Hibernate提供的三個實現類,有對應的三個簡短名,“jta”、“thread”、“managed”。

六、Configuration

  1.編程配置

  一個org.hibernate.cfg.Configuration的實例表示一個應用程序的所有Java類型到數據庫類型的映射。org.hibernate.cfg.Configuration是用來建造一個org.hibernate.SessionFactory。被編譯的映射是來自所有的XML映射文件。

  片斷1.

 
Configuration cfg = new Configuration().addResource(“test.hbm.xml”);

  片斷2.

 
Configuration cfg = new Configuration().addClass(com.test.class);

  片斷3.

 
Configuration cfg = new Configuration().setProperty(“hibernate.dialect”,“org.hibernate.dialect.DB2Dialect”);

 

  Configuration可以接收的選項:

  (1)傳遞一個java.util.Properties到Configuration.setProperties()。

  (2)放一個hibernate.properties文件到類路徑的根目錄。

  (3)設置系統properties,通過java –Dproperty=value。

  (4)包含標簽指定值在hibernate.cfg.xml文件。

  org.hibernate.cfg.Configuration對象是有意作為一個開始時間生成的對象的,一旦SessionFactory被創建,他將被拋棄掉。 

七、獲取SessionFactory

  當org.hibernate.cfg.Configuration解析完所有的映射文件后,應用程序應該獲取一個org.hibernate.Session實例的工廠。這個工廠是被應用程序的所有線程共享的。

 

 
SessionFactory sessionFactory = cfg.buildSessionFactory();

  Hibernate允許應用程序實例多個SessionFactory。對于使用多個數據庫的應用程序是非常有用的。

 

八、JDBC Connections(Session是對JDBC連接的封裝)

  通常,你應該使用org.hibernate.SessionFactory來創建或共享JDBC。如果這采用這種方法,是非常簡單的。

 
Session session = sessionFactory.openSession();

當你的操作需要訪問數據庫時,一個JDBC連接就會從連接池中被獲取。對于這個工作,我們應該給Hibernate提供一些JDBC連接屬性。所有的Hibernate屬性名和語義學都被定義在org.hibernate.cfg.Environment。我們現在描述對于JDBC連接配置的一些更重要的設置。

  1.如果你設置以下屬性,Hibernate將獲取或共享連接使用java.sql.DriverManager:

  hibernate.connection.driver_class 
  hibernate.connection.url 
  hibernate.connection.username 
  hibernate.connection.password 
  hibernate.connection.pool_size

  Hibernate自己擁有的連接池算法是沒有發展的。他是為了你的初始接觸使用的,而不是為了你的產品使用的,甚至性能測試時使用。為了更好的性能和穩定性考慮,你應該使用第三方的連接池產品。只需要替換hibernate. connection.pool_size屬性的設置用相應連接池的設置。這將關閉Hibernate內部的連接池。例如,可以使用C3P0。

  C3P0是一個開源的JDBC連接池,被放置在Hibernate發布文件的lib目錄下,隨Hibernate一塊發行。如果你設置hibernate.c3p0.*屬性,Hibernate將會使用org.hibernate.connection.C3P0ConnectionProvider為共享連接。如果你想使用proxool作為連接池,你可以通過查閱hibernat.properties或Hibernate站點獲取需要設置的屬性名設置。

  C3P0配置舉例,屬性文件片斷:

  hibernate.connection.driver_class= 
  hibernate.connection.url= 
  hibernate.connection.username= 
  hibernate.connection.password= 
  hibernate.c3p0.min_size= 
  hibernate.c3p0.max_size= 
  hibernate.c3p0.timeout= 
  hibernate.c3p0.max_statements= 
  hibernate.dialect=

  2.對于在應用服務器內運行的程序,多數情況你應該配置Hibernate通過JNDI找到服務器的javax.sql.DataSource來獲取連接。你需要設置以下屬性。

  hibernate.connection.datasource 
   hibernate.jndi.url  (可選) 
  hibernate.jndi.class  (可選)  
  hibernate.connection.username  (可選) 
  hibernate.connection.password  (可選)

  你可以通過實現org.hibernate.connection.ConnectionProvider來定義自己的獲得連接的策略。通過hibernate.connection.provider_class配置使用自己的定義起作用。

強人Hibernate文檔筆記(上)

強人Hibernate文檔筆記(中)

強人Hibernate文檔筆記(下)
0
0
 
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()