Atea - Hero's Grave

面向对象,开源,框架,敏捷,云计算,NoSQL,商业智能,编程思想。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  40 随笔 :: 0 文章 :: 28 评论 :: 0 Trackbacks
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
posted on 2008-07-28 16:57 Atea 阅读(3450) 评论(0)  编辑  收藏 所属分类: Hibernate

只有注册用户登录后才能发表评论。


网站导航: