我在事务/会话管理方面遇到了一些问题,因为我从 Hibernate 3.6 切换到了 Hibernate 4.1.x
我使用 Spring 3.1.2、Hibernate 4.1.4、WebSphere 8.5 和 Oracle 11。
在我的 WebApp 中,我用以下方法标记了一些方法:
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
这对我的使用 OpenSessionInViewFilter 和 getSessionFactory().getCurrentSession() 的 webapp 来说工作正常。
但是我的一些代码被 JMS 或 Quartz 作业调用(没有 OpenSessionInViewFilter)导致
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
在互联网上进行了一些研究后,我将我的交易更改为:
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
现在有一个打开的会话,Tomcat 一切正常,但在 WebSphere 上出现以下错误:
[SqlExceptionHelper] : SQL Error: 0, SQLState: null
[SqlExceptionHelper] : DSRA9010E: 'setReadOnly' wird in der WebSphere-Implementierung java.sql.Connection nicht unterstützt.
一些帖子说,Oracle 不支持只读。但是使用 Propagation.SUPPORTS 或使用 Tomcat 它可以工作。现在我不知道该怎么办。用 Propagation.REQUIRED 和 readOnly = false 标记 JMS 调用的所有方法?
有更好的想法吗?或者这是使用 WebSphere 时 Spring 中的错误?