Scheduler,CrudRepository和TransactionRequiredException

时间:2017-07-12 12:22:02

标签: java spring transactions spring-data-jpa scheduler

我有一个CrudRepository和一个删除数据的方法:

public interface SampleRepository extends PagingAndSortingRepository<Sample, String> {

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

如果我使用休息控制器,它会起作用:

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

我想实现一个调度程序来删除过时的数据。 例如:

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

调度程序在正确的时间工作,但我遇到了异常:

  

嵌套异常是   org.springframework.dao.InvalidDataAccessApiUsageException:正在执行   更新/删除查询;嵌套异常是   javax.persistence.TransactionRequiredException:执行   更新/删除查询

我错在哪里?

1 个答案:

答案 0 :(得分:0)

您需要在事务中包含您的方法,如下所示:

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