2017-07-12 6 views
1

は、私がCrudRepositoryやデータを削除する方法があります:スケジューラ、CrudRepositoryとTransactionRequiredException

@RequestMapping(value = "/delele", method = RequestMethod.DELETE) 
public void deleteOldData(@RequestParam(value = "date") String date) { 
     sampleRepository.deleteOutdatedData(Instant.parse(date)); 
} 

私は、スケジューラを実装したいと思います:

public interface SampleRepository extends PagingAndSortingRepository<Sample, String> { 

    @Modifying 
    @Transactional 
    @Query("delete from Sample where creationTimestamp <= ?1") 
    public void deleteOutdatedData(Instant expirationTimestamp); 
} 

をそれは私が残りのコントローラを使用している場合は動作します古いデータを削除します。たとえば :

入れ子の例外 org.springframework.dao.InvalidDataAccessApiUsageExceptionです:クエリを削除/ アップデートを実行

@Scheduled(fixedDelayString = "${clean-processing-delay}") 
public void cleanOutdatedData() { 
    Instant instant = Instant.now().minusMillis(expirationInterval); 
    sampleRepository.deleteOutdatedData(instant); 
} 

例外は、スケジューラは、適切なタイミングで動作しますが、私はキャッチ;実行 更新/削除クエリ私は間違っています

:ネストされた例外が javax.persistence.TransactionRequiredExceptionですか?

+0

あなたは[この](https://github.com/spring-projects/spring-boot/issues/3576#を読みました発行番号-295983737)? – Cepr0

+0

ありがとう、私はそれを試してみます。 – Alexander

答えて

0

あなたはこのように、トランザクションにあなたの方法を包むする必要があります。

@Scheduled(fixedDelayString = "${clean-processing-delay}") 
    @Transactional 
    public void cleanOutdatedData() { 
    Instant instant = Instant.now().minusMillis(expirationInterval); 
    sampleRepository.deleteOutdatedData(instant); 
    } 
+0

ありがとうございましたが、それもうまくいきませんでした((( – Alexander

関連する問題