hibernate中取得session的两种方式

<PRE class=java name="code" sizcache="1" sizset="2"><PRE class=javascript name="code">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);
    }
  }
}</PRE><BR>
<BR>
<PRE></PRE>
<PRE></PRE>

</PRE>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值