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