我有一个测试用例,需要将 100,000 个实体实例持久化到数据库中。我目前正在使用的代码可以实现这一点,但是直到所有数据都持久化到数据库中,需要最多 40 秒的时间。数据从一个大约为 15 MB 的 JSON 文件中读取。
之前我已经在另一个项目中的自定义存储库中实现了批量插入方法。然而,在那种情况下,我有很多顶级实体需要持久化,只有很少数量的嵌套实体。
在我的当前情况下,我有 5 个 Job
实体,它们包含约 30 个 JobDetail
实体的列表。一个 JobDetail
包含 850 到 1100 个 JobEnvelope
实体。
在写入数据库时,我使用默认的 save(Iterable<Job> jobs)
接口方法提交 Job
实体的列表。所有嵌套实体都具有 PERSIST
级联类型。每个实体都有自己的表。
启用批量插入的常规方式是实现一个自定义方法,例如 saveBatch
,定期刷新缓存。但是,在这种情况下,我的问题是 JobEnvelope
实体。我没有使用 JobEnvelope
存储库使它们持久化,而是让 Job
实体的存储库处理它们。我使用 MariaDB 作为数据库服务器。
所以我的问题归结为以下几点:如何使 JobRepository
批量插入其嵌套实体?
这些是我关注的三个实体:
Job
@Entity
public class Job {
@Id
@GeneratedValue
private int jobId;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "job")
@JsonManagedReference
private Collection<JobDetail> jobDetails;
}
职位详情
@Entity
public class JobDetail {
@Id
@GeneratedValue
private int jobDetailId;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "jobId")
@JsonBackReference
private Job job;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "jobDetail")
@JsonManagedReference
private List<JobEnvelope> jobEnvelopes;
}
就业信封
@Entity
public class JobEnvelope {
@Id
@GeneratedValue
private int jobEnvelopeId;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "jobDetailId")
private JobDetail jobDetail;
private double weight;
}
IDENTITY
ID 生成器不可行。适用于任何其他 ID 生成器。 - Dragan Bozanovicnative
是默认值,我认为如果你只指定@GeneratedValue
,它会首先检查数据库是否支持IDENTITY
。 - Dragan Bozanovic