Hibernate3以后,建议使用SessionFactory.getCurrentSession()的方式来创建Session并绑定到ThreadLocalSessionContext.
在集成Spring时,Spring通过org.springframework.orm.hibernate4.SpringSessionContext来管理Session,具体来说Spring要通过事务管理器将Session绑定到SpringSessionContext上。由于目前的Spring的事务管理主要使用注解式事务,所以我也是采用这种方式来注册和使用事务管理器的。但是在调用SessionFactory.getCurrentSession()时一直报错:Could not obtain transaction-synchronized Session for current thread。帖子中给出的建议往往是检查配置文件中配置有没有齐全。然而我确定自己的配置是全的。
后来根据一个帖子的建议使用了Opensessioninviewfilter。这个时候确实可以得到Session了,但是在增删改时却没有办法自动提交事务,Sesssion缓存无法同步到数据库,而需要手动进行Session.flush()操作来清理一级缓存,同时事务管理器也没有起作用了。后来查看了一些资料,大概了解了这个Filter的原理是在Request发起时自动为这个Request维持了一个Session,所以在getCurrentSession时是可以得到Session的。虽然可以得到Session,但是配置的事务管理器却依然没有起作用,这没有达到使用事务的目的。
这个问题最后是在一个不起眼的回帖中找到了解决方案,原贴如下:https://www.oschina.net/question/27371
Spring3+Hibernate4注解式事务中无法获取Session的问题
最新推荐文章于 2022-05-11 18:13:50 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)