Hibernate Session獲取方法大致有兩種:
方法1. SessionFactory.openSession();
方法2. SessionFactory.getCurrentSession();
以前自己寫代碼都是用方法1取session。今天學會了方法2,以后就可以用它來提高效率了:
1.在xml或properties文件里設置current_session_context_class,例如:
hibernate.current_session_context_class=thread
這里用的是基于ThreadLocal的ThreadLocalSessionContext類。Hibernate還提供了其他的類,近期計劃學習一下JTA。
2.然后就可以取Session了:
Session sessionOne = factory.getCurrentSession();
之后當我對Session操作的時候拋出了"*** is not valid without active transaction"的異常,查資料才發現用方法2取得的Session必須和Transaction配套使用,即使只是進行search操作:
sessionOne.beginTransaction();
//CRUD..
最后貼一段代碼:
@Test
public void testSession() throws Exception{
Session sessionOne = factory.getCurrentSession();
sessionOne.beginTransaction();//important.
System.out.println("session1: " + sessionOne.getFlushMode() );
Session sessionTwo = factory.getCurrentSession();
sessionTwo.beginTransaction();
System.out.println("session2: " + sessionTwo.getFlushMode() );
sessionOne.setFlushMode(FlushMode.ALWAYS);
System.out.println("session1: " + sessionOne.getFlushMode() );
System.out.println("session2: " + sessionTwo.getFlushMode() );
//notice!
System.out.println("sessionOne equals sessionTwo? " + (sessionOne.equals(sessionTwo)) );
//need not.
//sessionOne.close();
//sessionTwo.close();
//2009/02/09 更新
//在用getCurrentSession獲得session的時候,如果transaction.commit()的話,session會自動被關閉。
//如果沒有commit的話,還是需要手動關閉才行!
}
Print out:
session1: AUTO
session2: AUTO
session1: ALWAYS
session2: ALWAYS
sessionOne equals sessionTwo? false