1. 程式人生 > >getSession()和getCurrentSession()的區別及常見問題

getSession()和getCurrentSession()的區別及常見問題

1. 採用getCurrentSession()建立的session會繫結到當前執行緒中(第一次呼叫時會建立一個Session例項,如果該Session未關閉,後續多次獲取的是同一個Session例項),而採用openSession()建立的session則不會(每次開啟都是新的Session,所以多次獲取的Session例項是不同的)。

2.採用getCurrentSession()建立的session在commit或rollback時會自動關閉,而採用openSession()建立的session必須手動關閉

3.使用getCurrentSession時,需要在配置檔案中新增如下:

(1)如果使用的是本地事務(JDBC事務)

<property name="current_session_context_class">thread</property> 
(2)如果使用的是全域性事務(JTA事務)(hibernate3.0裡只能和jta繫結
<property name="current_session_context_class">jta</property> 

4.常見問題:

spring管理事務的話,如果要保證當前執行緒內只有一個session,需要將sessionFactory傳遞給org.springframework.orm.hibernate3.HibernateTransactionMana

ger,spring負責事務的開始,提交,回滾以及session的關閉,假設spring用於管理事務的session是(session1)。如果我還用HibernateUtils.getCurrentSession()方法獲得session的話,得到的session卻是(session2),和開始事務的session不是同一個物件,就造成session2的事務沒有提交,對資料庫的操作無效。

總結

4.1如果想讓spring幫你管理事務,只能在spring中配置SessionFactory。如果使用hibernate原有的sessionFactory,則只能自己手動管理事務。

4.2如果想使用sessionFactory.getCurrentSession()方法,必須配置sessionFactory和jta或thread繫結。但是hibernate3.

0不支援與thread繫結,3.1以上才支援。

4.3sessionFactory.getCurrentSession()方法取得的session,在做資料庫操作時必須在事務中做,包括只讀的查詢,否則會報錯。