2017-06-14 95 views
0

我遇到了一个问题,我一次保存一个实体列表,有时某些行的值会写入错误的列。保存多个实体时弹簧JPA插入错误的列

基本上,我有一个电影实体,其延伸显示(与@MappedSuperclass注解),该延伸TraceableEntity,其也标注了@MappedSuperclass,如下所示:

@MappedSuperclass 
@EntityListeners(TraceableEntity.TraceableEntityListener.class) 
public abstract class TraceableEntity { 
    @Column 
    private Date createdOn; 

    @Column 
    private Date dateUpdated; 

    public Date getCreatedOn() { 
     return createdOn; 
    } 

    public void setCreatedOn(Date createdOn) { 
     this.createdOn = createdOn; 
    } 

    public Date getDateUpdated() { 
     return dateUpdated; 
    } 

    public void setDateUpdated(Date dateUpdated) { 
     this.dateUpdated = dateUpdated; 
    } 

    public static class TraceableEntityListener { 
     @PrePersist 
     public void beforeInsert(TraceableEntity entity) { 
      if (entity.getCreatedOn() == null) { 
       entity.setCreatedOn(new Date()); 
      } 
     } 

     @PreUpdate 
     public void beforeUpdate(TraceableEntity entity) { 
      entity.setDateUpdated(new Date()); 
     } 
    } 
} 

现在,在有些场合,创建的的值在结束于dateUpdated,如此screenshot所示。

简而言之,我的应用程序是一个从API中检索数据的刮板。我在CompletableFuture中使用RestTemplate同时下载数据,然后一切保存。调用.save(...)的方法用@Transactional进行注释。当列表大小大约在1500以下时,节省是好的,但出于某种原因,当大小超过1500时似乎出现了问题。我真的很感谢你在这件事上的时间和帮助!

+0

奇怪的是,如果我只刮掉'dateUpdated'中的'createdOn'的行(即截图中的最后4个条目),一切都很好......我不知道这里发生了什么。 –

+0

假设你想要Spring的审计机制我认为使用Spring数据审计很容易。请参考这个[示例](http://www.baeldung.com/database-auditing-jpa) –

回答

0

它总是发生在同一个地方吗?例如,你是否缺少一些行?也许你正在刮的一些东西的文本有特殊的字符,但没有正确地转义?您可能想要打开日志记录以查看正在发送到服务器的内容。

原因是如果你只刮了“有问题”的电影,结果很好,可能是因为实际问题发生在有问题的电影之前。

+0

嗨,杰夫,我刚才发现这是API的问题,而不是我的代码... –