我有一个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:执行更新/删除查询
我哪里弄错了?
您需要在事务中包含您的方法,如下所示:
@Scheduled(fixedDelayString = "${clean-processing-delay}")
@Transactional
public void cleanOutdatedData() {
Instant instant = Instant.now().minusMillis(expirationInterval);
sampleRepository.deleteOutdatedData(instant);
}