Spring 春季jpa赢得';不要更新新数据

Spring 春季jpa赢得';不要更新新数据,spring,spring-data-jpa,Spring,Spring Data Jpa,我想根据请求更新新数据 请求JSON数据如下所示 [{"media_id : 1, "path" : "some path", ...}, {"media_id : 2, "path" : "some path", ...}] 这些主键已存在于数据库中 因此,它将更新这些行,并且应该进行更新 但是在调试日志上更新sql只更新旧数据 我签出了媒体对象,它包含来自请求的新数据 但jpa仍在尝试使用旧数据进行更新 我犯了什么错 private List<Media> upsertMedi

我想根据请求更新新数据

请求JSON数据如下所示

[{"media_id : 1, "path" : "some path", ...}, {"media_id : 2, "path" : "some path", ...}]
这些主键已存在于数据库中

因此,它将更新这些行,并且应该进行更新

但是在调试日志上更新sql只更新旧数据

我签出了媒体对象,它包含来自请求的新数据

但jpa仍在尝试使用旧数据进行更新

我犯了什么错

private List<Media> upsertMedia(SquarePostDetailResource postToUpsert) {

    List<Media> media = postToUpsert.getContent().getMedia();

    media.forEach((item) -> {
        item.setCreatedAt(item.getId() == null ? new Date() : item.getCreatedAt());
        item.setModifiedAt(new Date());
        item.setMember(Member.builder().id(postToUpsert.getMemberId()).build());
        item.setSquare(Square.builder().id(postToUpsert.getSquareId()).build());
        item.setSquarePost(SquarePost.builder().id(postToUpsert.getPostId()).build());
    });


    return (List<Media>) mediaRepo.save(media);
}
私有列表upsertMedia(SquarePostDetailResource postToUpsert){
List media=postToUpsert.getContent().getMedia();
media.forEach((项目)->{
item.setCreatedAt(item.getId()==null?新日期():item.getCreatedAt());
item.setModifiedAt(新日期());
item.setMember(Member.builder().id(postToUpsert.getMemberId()).build());
item.setSquare(Square.builder().id(postToUpsert.getSquareId()).build());
item.setSquarePost(SquarePost.builder().id(postToUpsert.getPostId()).build());
});
返回(列表)mediaRepo.save(媒体);
}

如果您的意思是foreach内部的更新不会更新数据库,则可以尝试以下操作

private List<Media> upsertMedia(SquarePostDetailResource postToUpsert) {

    List<Media> media = postToUpsert.getContent().getMedia();
    List<Media> updatedMedia = new ArrayList<>();

    media.forEach((item) -> {
        item.setCreatedAt(item.getId() == null ? new Date() : item.getCreatedAt());
        item.setModifiedAt(new Date());
        item.setMember(Member.builder().id(postToUpsert.getMemberId()).build());
        item.setSquare(Square.builder().id(postToUpsert.getSquareId()).build());
        item.setSquarePost(SquarePost.builder().id(postToUpsert.getPostId()).build());
        updatedMedia.add(item);
    });


    return (List<Media>) mediaRepo.save(updatedMedia);
}
私有列表upsertMedia(SquarePostDetailResource postToUpsert){
List media=postToUpsert.getContent().getMedia();
List updateMedia=new ArrayList();
media.forEach((项目)->{
item.setCreatedAt(item.getId()==null?新日期():item.getCreatedAt());
item.setModifiedAt(新日期());
item.setMember(Member.builder().id(postToUpsert.getMemberId()).build());
item.setSquare(Square.builder().id(postToUpsert.getSquareId()).build());
item.setSquarePost(SquarePost.builder().id(postToUpsert.getPostId()).build());
UpdateMedia.add(项目);
});
返回(列表)mediaRepo.save(UpdateMedia);
}

如果您的意思是foreach内部的更新不会更新数据库,则可以尝试以下操作

private List<Media> upsertMedia(SquarePostDetailResource postToUpsert) {

    List<Media> media = postToUpsert.getContent().getMedia();
    List<Media> updatedMedia = new ArrayList<>();

    media.forEach((item) -> {
        item.setCreatedAt(item.getId() == null ? new Date() : item.getCreatedAt());
        item.setModifiedAt(new Date());
        item.setMember(Member.builder().id(postToUpsert.getMemberId()).build());
        item.setSquare(Square.builder().id(postToUpsert.getSquareId()).build());
        item.setSquarePost(SquarePost.builder().id(postToUpsert.getPostId()).build());
        updatedMedia.add(item);
    });


    return (List<Media>) mediaRepo.save(updatedMedia);
}
私有列表upsertMedia(SquarePostDetailResource postToUpsert){
List media=postToUpsert.getContent().getMedia();
List updateMedia=new ArrayList();
media.forEach((项目)->{
item.setCreatedAt(item.getId()==null?新日期():item.getCreatedAt());
item.setModifiedAt(新日期());
item.setMember(Member.builder().id(postToUpsert.getMemberId()).build());
item.setSquare(Square.builder().id(postToUpsert.getSquareId()).build());
item.setSquarePost(SquarePost.builder().id(postToUpsert.getPostId()).build());
UpdateMedia.add(项目);
});
返回(列表)mediaRepo.save(UpdateMedia);
}

如果定义了主键,则spring数据的保存方法jpa将更新数据库。调用save方法时,我可以从控制台日志中看到updatesql。但我的问题是,应该更新的字段是旧数据而不是新数据。您的意思是字段modifiedAt在update语句中没有
new Date()
值吗?您也可以尝试
List media=postToUpsert.getContent().getMedia()
for循环之后和
mediaRepo.save(媒体)之前。我刚刚注意到您的评论在我的代码中指出了错误的地方。非常感谢。也许我应该更新答案以备将来参考,循环后再次获取媒体列表的最后一条评论对您有所帮助?如果定义了主键,则spring数据的保存方法jpa将更新数据库。调用save方法时,我可以从控制台日志中看到updatesql。但我的问题是,应该更新的字段是旧数据而不是新数据。您的意思是字段modifiedAt在update语句中没有
new Date()
值吗?您也可以尝试
List media=postToUpsert.getContent().getMedia()
for循环之后和
mediaRepo.save(媒体)之前。我刚刚注意到您的评论在我的代码中指出了错误的地方。非常感谢。也许我应该更新答案以备将来参考,在循环之后再次获取媒体列表的最后一条评论对你有帮助吗?