首页 > 解决方案 > Spring CRUD Repository 在计划任务期间不会更新现有记录

问题描述

我正在尝试postgres在计划任务期间创建/更新记录,但不知何故,更新仅在此任务的第一次运行期间发生。在随后的运行中,没有任何记录得到更新。奇怪的是,与此同时新的记录仍然被创造出来。如果我清除表并重新启动应用程序,所有记录将在第一个任务运行期间创建,但同样没有现有记录将在后续运行中获得任何更新。我所看到的只是我从外部资源中获取了新数据,这些数据设置为问题的内部字段issue.setFields,但没有任何内容保存到 db.xml 中。这是代码:

@Component
public class IssuesTask {

    @Autowired
    private IssuesRepository repository; // Spring CRUD repo

    @Transactional
    @Scheduled(cron = "0 */30 * * * ?")
    public void execute() {
        ArrayList<Issue> updateList = buildUpdateList();
        repository.saveAll(updateList);
    }

    private ArrayList<Issue> buildUpdateList() {
        ArrayList<Issue> updateList = new ArrayList<>();
        // get data to update current issues
        ArrayList<Map<String, String>> externalIssues = getExternalIssuesData();
        for (int i = 0; i < externalIssues.size(); ++i) {
            Map<String, String> fields = externalIssues.get(i);
            Integer issueId = fields.get("id");
            Issue issue = findOrBuildIssue(issueId);
            issue.setFields(fields);
            updateList.add(issue);
        }
        return updateList;
    }

    private Issue findOrBuildIssue(Integer id) {
        Optional<Issue> optionalIssue = repository.findById(issueId);
        Issue issue = optionalIssue.orElseGet(Issue::new);
        return issue;
    }
}

所有其他代码都非常标准 - 我有 entity Issue。为了管理里面的记录,postgres我创建了 CRUD 存储库。应用程序类如下所示:

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我对 Spring 还很陌生,并且已经为这个问题苦苦挣扎了一段时间。我认为这可能与会话/缓存未清除有关,但我不明白如何使用 CRUD 存储库来做到这一点。将不胜感激任何帮助,谢谢。

标签: javaspringjpaspring-data-jpaspring-repositories

解决方案


推荐阅读