hibernate中取得session的两种方式

Hibernate用SessionFactory提供session,并且SessionFactory提供了两种取得session的方法:getCurrentSession()和openSession()。
 
1.getCurrentSession()和openSession()的区别:
   1>.采用getCurrentSession()创建的session会绑定到当前线程中,即getCurrentSession会取得当前线程中已绑定的session,如果没有,则新建一个session并绑定到线程中。这样,保证了一个线程中各个业务方法使用的都是同一个线程,在编程式事务编程中省去了session的传递,是很方便的。而采用openSession()创建的session则只会新建session。
 
   2>.getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭。
 
2.使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
 * 如果使用的是本地事务(jdbc事务)
 <property name="hibernate.current_session_context_class">thread</property>
 * 如果使用的是全局事务(jta事务)
 <property name="hibernate.current_session_context_class">jta</property>
 
LogDaoImpl.java
public  class LogDaoImpl  implements LogDao { 
  @Override 
   public  void addLog(Log log, Session session) { 
    session.save(log); 
  }
测试类:
public  class test1 { 
   public  static  void main(String[] args) { 
/*    User user = new User();// 
    user.setName("sili3"); 
    addUser(user);*/
 
     
    User user2 =  new User(); 
    user2.setName( "wangwu4"); 
    addUserCurrent(user2); 
  } 

   /** 
    * 1.有异常发生,session还没有提交就在catch里回滚,故user插入不成功。log根本没有提交语句,也插入不成功 
    * 2.无异常发生,session提交,故user插入成功。log根本没有提交语句,也插入不成功。 
    *        说明他们用的不是同一个session 
    * @param user 
    */
 
   public  static  void addUser(User user) { 
    Session session =  null
    LogDao logDao =  new LogDaoImpl(); 
     try { 
      session = HibernateUtils.getCurrentSession(); 
      session.beginTransaction(); 
      session.save(user); 

      Log log =  new Log(); 
      log.setType( "操作日志"); 
      log.setDetail(user.getName() +  "录入系统"); 
      log.setTime( new Date()); 
      logDao.addLog(log, HibernateUtils.getSession()); //要保证addUser和addLog使用通一个session,才能保证他们在一个事务中 
       //System.out.println(9/0); 
      session.getTransaction().commit(); 
        
    }  catch (Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }  finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 

   /** 
    * 1.无//System.out.println(9/0);,没发生异常,只有session的事务提交,user和log都能插入成功。 
    *     说明他们用的是一个session 
    * 2.有System.out.println(9/0);发生异常,session回滚,user和log都插不进去。 
    *     也说明他们用的是一个session 
    * @param user 
    */
 
   public  static  void addUserCurrent(User user) { 
    Session session =  null
    LogDao logDao =  new LogDaoImpl(); 
     try { 
      session = HibernateUtils.getCurrentSession(); 
      session.beginTransaction(); 
      session.save(user); 

      Log log =  new Log(); 
      log.setType( "操作日志"); 
      log.setDetail(user.getName() +  "录入系统"); 
      log.setTime( new Date()); 
      logDao.addLog(log, HibernateUtils.getCurrentSession()); //要保证addUser和addLog使用通一个session,才能保证他们在一个事务中 
       //System.out.println(9/0); 
      session.getTransaction().commit(); 
        
    }  catch (Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }  finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 
}

     本文转自NightWolves 51CTO博客,原文链接: http://blog.51cto.com/yangfei520/253745 ,如需转载请自行联系原作者


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值