Hibernate Contextual sessions

Hibernate Contextual sessions


Contextual sessions:上下文session, 一個session只在一個給點的上下文中有效。

從3.0.1開始,Hibernate添加了SessionFactory.getCurrentSession()方法獲取current session。
從3.1開始,current的定義由org.hibernate.context.spi.CurrentSessionContext的實現定義。在配置文件中,經過hibernate.current_session_context_class指定CurrentSessionContext的實現類。沒有進行指定時,默認使用JTA實現。

Hibernate提供了三個實現:
org.hibernate.context.internal.JTASessionContext: current sessions被一個JTA事務跟蹤和限定範圍。Hibernate舊版本都使用這個實現。
org.hibernate.context.internal.ThreadLocalSessionContext: current sessions由執行線程跟蹤。該實現下,調用getCurrentSession方法,會返回一個session實例。在使用經過getCurrentSession獲取的session以前,必須調用session.beginTransaction()方法或者經過session獲取Transaction後,調用begin()方法將session綁定到上下文,不然使用該session進行CRUD時拋出異常,此時再次調用getCurrentSession方法獲取的session和前面獲取的session在同一個事務上下文中。調用commit()或者rollback()方法後,session將和上下文解除綁定並被關閉,再使用這個session進行CRUD時就會拋出異常。
org.hibernate.context.internal.ManagedSessionContext: current sessions由執行線程跟蹤。可是,用戶必須負責調用ManagedSessionContext類的靜態方法綁定和解除綁定一個Session實例。ManagedSessionContext不會open, flush, 或者close一個Session。該實現下,調用getCurrentSession方法,不會返回一個session實例。用戶必須本身open一個session,再綁定到ManagedSessionContext中,使用完成後,再手工解除綁定。調用commit()或者rollback()方法後,session不會上下文解除綁定,也不會被關閉。
相關文章
相關標籤/搜索