在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的延时加载了。
分享到:
相关推荐
里面为一个演示spring事务传播机制的小demo。简单实现转账功能,通过添加注解调整传播级别,同时通过日志打印查看sql是否执行,在mysql中的数据是否发生了变化(操作提交还是回滚了)。
spring-transaction.jar.zip
spring 事务管理工程,导入到MyEclipse 中既可以使用
Spring在Transaction事务传播行为种类,希望对大家有所帮助
可以对hibernate的 Session 和 Transaction 有更深入的认识 希望对一些概念比较模糊的人 有帮助
org.springframework.transaction-3.2.2.RELEASE最新版本
Implementing Transaction Suspension in Spring
NULL 博文链接:https://wsjjasper.iteye.com/blog/1570448
Spring中的事务管理问题:org.springframework.transaction-3.1.0.M1.jar包。org.springframework.transaction-3.1.0.M1.jar包。
NULL 博文链接:https://stewchicken.iteye.com/blog/938875
org.springframework.transaction-3.1.0.M2
分布式事务框架LCN支持springcloud 2.0.5 ,transaction-springcloud-4.1.2.jar
org.springframework.transaction-3.1.0.M1.jar
org.springframework.transaction-3.2.4.RELEASE.jar,最新版的org.springframework.transaction,Wed Aug 07 16:44:37 GMT+01:00 2013
spring-tx spring-transaction spring事务管理实例
spring-hibernate-maven-transaction整合
org.springframework.transaction-3.0.0.M4.jar
Spring交易演示spring-transaction-demo spring事务传播机制的7种使用方式
在该JAR包的org.springframework.transaction包中,有3个接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus,如下图所示: Spring事务管理的三个核心接口 5.1.1 事务管理的核心接口 1....
此文档是X/OPEN DTP的TX规范,后续还会有XA规范上传。