有这样一种需求:
(3)、用getCurrentSession方法,crud操作都必须在事务的环境下运行;(查询也要开启事务)
(4)、当事务提交的时候,如果session的产生方式为getCurrentSession,则自动关闭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的配置文件中:
(2)、如果session为null,则调用sessionFactory.openSession方法新产生一个session
把新产生的session放入到threadlocal中;
如果session不为null,直接获取当前线程中的session
配置:
在hibernate.cfg.xml的配置文件中:
<!--
session从当前线程中产生
-->
<
property
name ="current_session_context_class" >thread </ property>
|
(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();
}
}
|