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的延时加载了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值