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