Seamがどのように機能するかよくわからないので、この回答が当てはまらない場合は事前にお詫びします。
@Transactional
というメソッドに気づきました protected
。これは、別の内部メソッドによって呼び出されていることを意味します。
SpringのAOPを使用して、 publicをマークします。 @Transactional
を使用するメソッド これらはラップされ、トランザクションプロキシに置き換えられます。外部クラスがpublic
を呼び出すとき メソッドでは、トランザクションを形成するプロキシを呼び出しています。外部クラスが別のpublic
を呼び出す場合 ではないメソッド @Transactional
でマークされています 次に、内部メソッドを呼び出します。つまり、プロキシがまったく呼び出されていないため、トランザクションは作成されません。
春には、doWork()
を変更しても 公開する方法でも、同じ問題が発生します。プロキシオブジェクトが呼び出されていないため、トランザクションはありません。クラス内で行われたメソッド呼び出しは、プロキシオブジェクトを呼び出していません。
いくつかのドキュメントをざっと読むと、Spring AOPのように、SeamがCGLibプロキシ を使用していることがわかります。 。問題は、プロキシされたオブジェクト内から呼び出された場合でも、すべてのメソッドをプロキシできるかどうかです。この回答が当てはまらない場合は、時間を無駄にして申し訳ありません。