誰かがGroovyクラスで開始されていないSpringトランザクション(クラスレベル、プロキシ、アノテーション駆動型)の経験がありますか?スタックトレースにトランザクションを開始するための呼び出しが含まれていないことに気付いた、原因不明のLazyInitialization例外に苦労してきました。クレイジーに聞こえますが、GroovyがTransactionalアノテーションを採用しているかどうか疑問に思う必要があります。
2 に答える
実際、私は問題の原因を見つけました。Springのドキュメントから(私は強調して追加しました):
24.5.1。AOP-スクリプト化されたBeanのアドバイスSpringAOPフレームワークを使用してスクリプト化されたBeanにアドバイスすることができます。Spring AOPフレームワークは、アドバイスされているBeanがスクリプト化されたBeanである可能性があることを実際には認識していないため、使用している、または使用することを目的としているすべてのAOPユースケースと機能はスクリプト化されたBeanで機能します。スクリプト化されたBeanにアドバイスするときに注意する必要がある(小さな)ことが1つだけあります...クラスベースのプロキシは使用できません。インターフェイスベースのプロキシを使用する必要があります。 もちろん、スクリプト化されたBeanにアドバイスするだけではありません...サポートされている動的言語でアスペクト自体を記述し、そのようなBeanを使用して他のSpringBeanにアドバイスすることもできます。ただし、これは実際には動的言語サポートの高度な使用法になります。
私の問題は、クラスベースのプロキシを使用していたことでした。
Grailsを使用している場合は、
MyDomainClass.withTransaction {
// Code within the transaction goes here
}
トランザクションアノテーションの代替として。コードがこのアプローチで機能する場合、問題の原因はアノテーションであると確信できます(ただし、これが永続的な解決策として気に入らない場合があることは理解しています)。