0

トランザクション構成のサブクラス化に問題があります。

私はこのメソッドを持つクラスAを持っています:

@Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
// some dao operations
        return eventMessage;
    }

次に、クラスBサブクラスクラスAであり、activateメソッドをオーバーライドします。

 InserimentoCanaleActivator extends ModificaOperativitaRapportoActivator ....

    @Override
        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
// others dao operations 
    return super.activate(eventMessage);

スーパーメソッドを単独で実行する場合は独自のトランザクションが必要ですが、クラスBのメソッドを実行する場合は、すべての操作が同じトランザクションに参加する必要があります。

何か案が?

4

1 に答える 1

1

トランザクションはメソッド呼び出し全体をBeanにラップしますが、メソッドの個々のクラス実装のレベルではなく、Beanのレベルで適用されます。基本的に、SpringはAOPを使用してトランザクションを処理します。それは、プロキシオブジェクトをBean自体として配置することです。プロキシはトランザクションの開始を管理し、実装クラスでメソッドを実行してから、再び戻る途中でトランザクションを終了します(コミットまたはロールバック)。これはエレガントな方法であり、手動によるアプローチよりもはるかに簡単です(Javaの制限がある場合)。

プロキシ機構は、(@Transactionalアノテーションとその他の構成の存在によって)適用されると、実行するトランザクション処理のタイプ(propagationアノテーションのパラメーター)を調べて、適切なアクションを選択します。あなたの場合、スーパークラスに持た@Transactional(propagation=REQUIRES_NEW)せ、サブクラスに持たせたいのであれば、@Transactional(propagation=REQUIRED)それが機能することを期待します。スーパークラスのアノテーションは無視されます。これは、アノテーション機構が最初にサブクラスのアノテーションを確認し、検索を停止するためです。

于 2011-08-05T10:18:18.760 に答える