2016-04-11 1 views
3

次のように私はインターフェイスを持っている:バックエンドスレッドでJpaRepositoryを使用するにはどうすればよいですか?

public interface PackageRepository extends JpaRepository<DocPackage, String> { 
} 

は今、私は使用して私のRESTサービスから何の問題もなくこれを使用することができるよ:

@Resource 
PackageRepository repo; 

ノーとその上にトランザクションの呼び出しを行うことができます問題。しかし

私はワーカースレッドからこれをロードしよう:

public class MyWorker implements Runnable { 
    @Resource 
    PackageRepository repo; 

    @Transactional 
    private void doSomething() { 
     DocPackage pck = repo.findOne("key"); 
     pck.setStatus(2); 
     repo.saveAndFlush(pck); 
    } 

    public void run() { 
     //stuff 
     doSomething(); 
     //other stuff 
    } 
} 

new Thread(new MyWorker()).start(); 

私はこのレポにうまく読み取っ行うことができるんだけど、私は保存し、フラッシュ時はいつでも、私は例外を取得:

javax.persistence.TransactionRequiredException: no transaction is in progress 

これを正しく行う方法はありますか?

答えて

2

春に@Transactional注釈を追加する必要があると思います。この意味は、@Transactionは、クラス外から呼び出されたメソッドの場合にのみ機能します。

修正するには、サービスを受ける方法を抽出します。 MyWorkerにサービスを注入してください。

+0

完璧、それは、ありがとう、ありがとう。 –

0

は、私はあなたがプロキシを使用して、デフォルトでは、あなたの方法

+0

サンプルを更新しました。はい、@Transactionalを既に使用しています。 –

関連する問題