Hibernate学习笔记——SessionFactory.getCurrentSession()

来源:互联网 发布:js get post 区别 编辑:程序博客网 时间:2024/04/30 13:21
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
原创粉丝点击