Hibernate的openSession()和 getCurrentSession()联系

一 深入探讨
在SessionFactory启动的时候,Hibernate会根据配置创建相应的CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession()。在currentSession()执行时,如果当前Session为空,currentSession会调用SessionFactory的openSession。

二 升级MySessionFactory
我们对获取MySessionFactory的工具类进行升级,让它可以直接返回全新的session和线程相关的session。

三 升级后的代码
package com.cakin.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil { //SqlHelper
        private static SessionFactory sessionFactory=null;
        //使用线程局部模式
        private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
        private HibernateUtil(){};
        static {
                sessionFactory=new Configuration().configure().buildSessionFactory();
        }
        
        //获取全新的全新的sesession
        public static Session openSession(){
                return sessionFactory.openSession();
        }
        //获取和线程关联的session
        public static Session getCurrentSession(){
                Session session=threadLocal.get();
                //判断是否得到
                if(session==null){
                        session=sessionFactory.openSession();
                        //把session对象设置到 threadLocal,相当于该session已经和线程绑定
                        threadLocal.set(session);
                }
                return session;         
        }
}



四 测试代码和测试结果
package com.cakin.view;
import java.util.Date;
import javax.management.RuntimeErrorException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.cakin.domain.Employee;
import com.cakin.util.HibernateUtil;
import com.cakin.util.MySessionFactory;
public class TestMain {
    /**
     * @param args
     */
    public static void main(String[] args) {
                Session session1= HibernateUtil.openSession();
                Session session2= HibernateUtil.openSession();
                Session session3= HibernateUtil.getCurrentSession();
                Session session4= HibernateUtil.getCurrentSession();
                System.out.println(session1.hashCode()+":"+session2.hashCode());
                System.out.println(session3.hashCode()+":"+session4.hashCode());
    }
}


1467214962:2074631480
1786791668:1786791668

五 怎样理解线程局部模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值