0

Webアプリに次のJSFバッキングBeanがありました

@ManagedBean
class MyBackingBean implements Serializable {

    private MyHibernateRepository repository;
    ...

    @Transactional 
    public void save() {
        ....
        repository.save(myObject);
    }

}

repository.saveメソッド呼び出しに到達すると、次のエラーが発生します

no transaction is in progress

2つの質問があります

  1. これはこのようなバグが原因ですか?
  2. 2つの回避策があると思います-他に何かありますか?

2.1最初の回避策-を使用する

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  protected void doInTransactionWithoutResult(TransactionStatus status) {
    repository.save(myObject);
  }
});

2.22番目の回避策

ヘルパークラスを作成し、代わりにそれに注釈を付けます。

2.3(考えられる3番目の回避策は、内部クラスのメソッドに@Transactionalアノテーションを付けることです。これは2.2と非常によく似ています)。

4

1 に答える 1

2

Springアノテーションを使用する場合(これ@TransactionalはSunの標準ですが、実装が必要です)-SpringはAOPを使用してクラスにアノテーションを付け、トランザクション処理コードを追加します。これはSpringBeanでのみ機能します。クラスがJSFのバッキングBeanである場合、Mojarraフレームワークは独自のトランザクション処理コードをこのアノテーションに挿入しません。

簡単な答え@Transactional-SpringによってロードされたBeanで機能します。それ以外の場合は、それをサポートするフレームワークを見つけるか、機能しないと想定する必要があります。

于 2012-05-06T23:39:23.720 に答える