4

Java EE 7、CDI、JPA、および JSF を試しています。

webapp が起動したら、CDI Bean (@PostConstruct でマーク) で初期化メソッドを実行して、データベースで何らかの作業を行います (いくつかの行を挿入するなど)。これにはトランザクションが必要ですが、これは思ったほど簡単ではありませんでした。

メソッドに @Transactional アノテーションを追加しようとしましたが、明らかに EJB でしか機能しません。実際に Bean を CDI Bean ではなく EJB に変換しようとしましたが、まだ @PostConstruct メソッドへのトランザクションを取得できませんでした。Bean の他のメソッドでは機能しましたが、私の @PostConstruct 初期化メソッドでは機能しませんでした。

次に、CDI Bean へのトランザクションを取得するためのメソッド インターセプターの作成について読みました。

http://eubauer.de/kingsware/2012/01/16/cdi-and-transactions-eg-in-jboss-7-0-2/

私もこれを試しましたが、うまくいきませんでした。どちらも機能しません。

では、CDI Bean の @PostConstruct 初期化メソッドへのトランザクションをどのように取得するのでしょうか?

4

1 に答える 1

2

どうやら次のようです。

@PostConstruct (InitializingBean インターフェースの afterPropertiesSet と同様) では、すべての後処理が既に完了していることを確認する方法がないため、(実際) トランザクションが存在しない可能性があります。それが機能していることを確認する唯一の方法は、TransactionTemplate を使用することです。

したがって、 @PostConstruct のデータベースで何かを行う唯一の方法は、次のようにすることです。

@Service("something")
public class Something 
{

    @Autowired
    @Qualifier("transactionManager")
    protected PlatformTransactionManager txManager;

    @PostConstruct
    private void init(){
        TransactionTemplate tmpl = new TransactionTemplate(txManager);
        tmpl.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                //PUT YOUR CALL TO SERVICE HERE
            }
        });
   }
}

注: 同様のスレッドですが、@PostConstruct メソッドで Spring フレームワーク @Transactional を参照しています

于 2013-12-23T09:08:54.210 に答える