2013-08-19 12 views
5

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

私は、データベースと対話する必要があるQuartzジョブを作成しています。私はこの仕事を得るために私が見つけることができるすべてを試しました。私は、@PersistenceContextと@Transactionalで注釈されたSpring管理コンポーネントをjobMap経由で渡そうとしましたが、entityManager.persist(o)の呼び出しは実行されますが、データベース内で何も起こりません。また、this answerと同様の試みを行い、ジョブオブジェクトに対して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プロジェクトを参照しているthis blog postが見つかりました。彼はJpaInterceptorを使ってHibernateセッションを確立していますが、これはDAOパターンを使用しています。@PersistenceContextを使用したいと思います。

明らかに、これが正しく動作するのを妨げているQuartzスレッドに関する何かがありますか?私はアイデアを忘れていて、SpringMVCコントローラへのWebサービスコールを作成してこの機能を実現することを検討しています。

答えて

6

CreateAlertJobはSpringで作成されていないため、@Transactionalは無効です。

次のオプションがあります:Beanを春に

+0

私はこれを最初に試していましたが、動作していませんでしたが、そこには他にもいくつかの問題があります。 Spring Beanでの作業は最良の選択肢と思われ、うまく動作しています。 – NTyler

関連する問題