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 を使用すると機能します。今、私は何をすべきかわかりません。JMS によって呼び出されたすべてのメソッドに Propagation.REQUIRED および readOnly = false を付けますか?
より良いアイデアはありますか?それとも、これは WebSphere を使用している場合の Spring のバグですか?