在OpenSessionInViewFilter会生成一个session并把它放到TransactionSynchronizationManager的ThreadLocal resources里面,这个session默认的是由配置文件中的"sessionFactory"得到的,可以在给OpenSessionInViewFilter你想要实现的sessionFactory。
然后在HibernateTransactionManager的doGetTransaction里面,根据配置文件中的sessionfactory去TransactionSynchronizationManager的Resource里面找相应的sessionHolder,所以如果配置的是同一个sessionfactory的话,就会得到open session in view中的session。
如果是不同的sessionfactory,在HibernateTransactionManager的doBegin里面有这么一段,很明显就是根据配置文件里的sessionfactory新生成一个session。显然这个和open session in view中的session不是同一个。
所以在处理多数据库时,如果设置多个sessionfactory,其中只能有一个能使用open session in view,其他的只能才用其他的方法解决hibernate的延时加载了。
然后在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的延时加载了。