2017-08-10 94 views
0

我想更新来自请求的新数据。spring jpa不会更新新的数据

请求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); 
} 

回答

0

如果您的意思是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); 
} 
+0

弹簧数据的保存方法如果主键被定义,jpa将更新数据库。 当调用save方法时,我可以从控制台日志中看到更新sql。 但我的问题是,应更新的字段是旧数据而不是新数据。 –

+0

你的意思是说修改过的字段在update语句中没有'new Date()'值吗? – lzagkaretos

+0

您也可以尝试'列出 media = postToUpsert.getContent()。getMedia();'在for循环之后和'mediaRepo.save(media);'之前''。 – lzagkaretos