获取添加了多少条新记录以及更新了多少条 JPA 的数字



我有以下实体:

public class Parent implements Serializable {
@Id
private Long propertyId;
@OneToMany(mappedBy = "parent", orphanRemoval = true, cascade = CascadeType.ALL)
private List<Child> objects = new ArrayList<>();

而儿童班:

public class Child implements Serializable {
@Id
@NotNull
private Long childId;
@Id
@JoinColumn(name = "parent_id")
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;

我正在从csv文件中的另一个api获取数据,对其进行解析并持久化。 我持久化数据的方式是:

  1. 首先从 csv 文件创建父对象
  2. 从 csv 文件创建子对象
  3. 为每个父级设置子项列表
  4. ,为每个子项设置父项列表

最后,我有以下代码来保存数据:

parentRepository.saveAll(parents);

其中父母是我拥有完整数据的完整列表。

我不时调用此 api,这意味着每次调用时都可能有新数据或相同数据,但最终我必须坚持它。 我的问题是如何跟踪添加了多少新记录以及更新了多少记录。我知道我可以做一些过滤的事情并查询每个实体并检查它是否存在,但由于我有大约 80 000 个实体,添加这么多查询真的很耗时。

关于如何做到这一点但又不那么耗时的任何建议?是否有任何类型的拦截器可能会在查询结束时为我提供数据?

一些背景:

  • 使用手动分配的 ID 时,如果要发送的对象已存在,则休眠不会发出插入或更新。
  • 这样做的原因是,每当您在具有手动分配 ID 的实体上调用save()时,hibernate 首先会进行选择以决定它是insert还是update
  • 但是由于它已经进行了选择,因此可以对其进行比较以确定它们是否完全相等,在这种情况下,它不会发出insertupdate
  • 您可以通过添加spring.jpa.show-sql=truespring.jpa.properties.hibernate.format_sql=truelogging.level.org.hibernate.SQL=DEBUGapplication.properties

溶液

  • 将以下字段和方法添加到实体
@Transient
private boolean updated;
@Transient
private boolean created;
@PrePersist
public void setCreated() {
this.created = true;
}
@PreUpdate
public void setUpdated() {
this.updated = true;
}
public boolean isCreated() {
return created;
}
public boolean isUpdated() {
return updated;
}
  • saveAll()后,
    • parent.isCreated()是真的,那么你就知道它是新的插入
    • parent.isUpdated()是真的,那么你就知道它是更新的
    • 如果两者都为 false,则不会发生插入或更新

最新更新