【Hibernate六】session的产生方式及事务管理

有这样一种需求:
Adao{
  aDao(){//开启事务
     Session session =  sessionFactory.openSession()
  }
}

Ddao{
   dDao(){//开启事务
       Session session =  sessionFactory.openSession()
   }
}

Bservice{
   bService(){//要求在同一个事务环境下完成
      aDao();//session
      dDao();//session
   }
}

要想使bService()在一个事务中完成,应该怎么办呢?sessionFactory.openSession()得到的session每次都是new出来的,所以
aDao()和dDao()不在同一个session中,不在同一个session,当然不能处于同一个事务。
为了实现以上的需求,需要使用sessionFactory.getCurrentSession():

为此,来讨论一下session的产生方式:

1.Session session = sessionFactory.openSession();
     使用此代码每次得到的都是一个新的session;

2. sessionFactory.getCurrentSession();
       (1)、先判断当前线程中有没有session(ThreadLocal)
       (2)、如果session为null,则调用sessionFactory.openSession方法新产生一个session
             把新产生的session放入到threadlocal中;
             如果session不为null,直接获取当前线程中的session
            配置:
            在hibernate.cfg.xml的配置文件中:
          <!--
          session从当前线程中产生
      -->
       < property  name ="current_session_context_class" >thread </ property>

       (3)、用getCurrentSession方法,crud操作都必须在事务的环境下运行;(查询也要开启事务)
       (4)、当事务提交的时候,如果session的产生方式为getCurrentSession,则自动关闭session;

示例代码:
ADao.java:
public  class ADao extends HibernateUtils{
      public  void saveClasses(Classes classes){
          Session session =  sessionFactory.getCurrentSession();
          session.save(classes);
     }
}
BDao.java:
public  class BDao extends HibernateUtils{
      public  void saveClasses(Classes classes){
          Session session =  sessionFactory.getCurrentSession();
          session.save(classes);
     }
}

CService.java:
public  class CService extends HibernateUtils{
      public  void saveClasses(){//在同一个事物中完成!
            //从当前线程得到session,并开启事务
          Session session =  sessionFactory.getCurrentSession();
          Transaction transaction = session.beginTransaction();
          
          ADao aDao =  new ADao();
          Classes classes2 =  new Classes();
          classes2.setCname(  "11");
          aDao.saveClasses(classes2);
          
            int a = 1/0; //设置异常,以上执行的代码无效
          
          BDao bDao =  new BDao();
          Classes classes3 =  new Classes();
          classes3.setCname(  "11");
          bDao.saveClasses(classes3);
          
          transaction.commit();
     }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值