5

Spring 3.1、JPA (Hibernate 経由)、Quartz を使用しています。通常、サービス Bean の @PersistenceContext アノテーション、SpringMVC コントローラー、または GraniteDS 管理のサービス呼び出しのいずれかを介して DB と対話します。

データベースと対話する必要がある Quartz ジョブの作成に取り組んでいます。私はこれを機能させるために見つけることができるすべてを試しました。jobMap を介して Spring 管理のコンポーネント (@PersistenceContext および @Transactional でアノテーションを付けたもの) を渡そうとしましたが、entityManager.persist(o) への呼び出しが実行されましたが、データベースで何も起こりません。また、この回答と同様に、ジョブ オブジェクトで autowireBean() を呼び出すファクトリ クラスを作成してみました。次のようにジョブクラスを設定しました。

public class CreateAlertJob implements Job {

    @PersistenceContext
    EntityManager entityManager;

    @Override
    @Transactional
    public void execute(JobExecutionContext context) throws JobExecutionException {

        SomeEntity entity = new SomeEntity();
        entityManager.persist(entity);
    }
}

同じ結果、メソッドは実行されますが、データベースは変更されません。GitHub プロジェクトを参照するこのブログ投稿を見つけました。彼は JpaInterceptor を使用して Hibernate セッションを確立していますが、これは DAO パターンを使用しており、@PersistenceContext の使用に固執したいと考えています。

明らかに、これが正しく機能するのを妨げているクォーツスレッドに関する何かがありますか? これを機能させるためだけに、SpringMVCコントローラーへのWebサービス呼び出しを行うことを検討しています。

4

1 に答える 1

6

yourCreateAlertJobは Spring によって作成され@Transactionalたものではないため、有効になりません。

次のオプションがあります。

于 2013-08-19T21:27:41.260 に答える