`
ganqing1234
  • 浏览: 169116 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

open session in view 和 spring transaction 管理

阅读更多
在OpenSessionInViewFilter会生成一个session并把它放到TransactionSynchronizationManager的ThreadLocal resources里面,这个session默认的是由配置文件中的"sessionFactory"得到的,可以在给OpenSessionInViewFilter你想要实现的sessionFactory。

然后在HibernateTransactionManager的doGetTransaction里面,根据配置文件中的sessionfactory去TransactionSynchronizationManager的Resource里面找相应的sessionHolder,所以如果配置的是同一个sessionfactory的话,就会得到open session in view中的session。
protected Object doGetTransaction()
    {
        HibernateTransactionObject txObject = new HibernateTransactionObject();
        txObject.setSavepointAllowed(isNestedTransactionAllowed());
        if(TransactionSynchronizationManager.hasResource(getSessionFactory()))
        {
            SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(getSessionFactory());
            if(logger.isDebugEnabled())
                logger.debug("Found thread-bound Session [" + SessionFactoryUtils.toString(sessionHolder.getSession()) + "] for Hibernate transaction");
            txObject.setSessionHolder(sessionHolder, false);
            if(getDataSource() != null)
            {
                ConnectionHolder conHolder = (ConnectionHolder)TransactionSynchronizationManager.getResource(getDataSource());
                txObject.setConnectionHolder(conHolder);
            }
        }
        return txObject;
    }


如果是不同的sessionfactory,在HibernateTransactionManager的doBegin里面有这么一段,很明显就是根据配置文件里的sessionfactory新生成一个session。显然这个和open session in view中的session不是同一个。
if(txObject.getSessionHolder() == null)
            {
                Interceptor entityInterceptor = getEntityInterceptor();
                Session newSession = entityInterceptor == null ? ((Session) (getSessionFactory().openSession())) : ((Session) (getSessionFactory().openSession(entityInterceptor)));
                if(logger.isDebugEnabled())
                    logger.debug("Opened new Session [" + SessionFactoryUtils.toString(newSession) + "] for Hibernate transaction");
                txObject.setSessionHolder(new SessionHolder(newSession), true);
            }


所以在处理多数据库时,如果设置多个sessionfactory,其中只能有一个能使用open session in view,其他的只能才用其他的方法解决hibernate的延时加载了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics