【发布时间】:2026-02-15 15:10:01
【问题描述】:
我有一个测试用例,我需要将 100'000 个实体实例持久化到数据库中。我目前使用的代码就是这样做的,但是在所有数据都保存在数据库中之前最多需要 40 秒。数据是从一个大小约为 15 MB 的 JSON 文件中读取的。
现在我已经在自定义存储库中为另一个项目实现了批量插入方法。但是,在那种情况下,我有很多*实体要持久化,只有几个嵌套实体。
在我目前的情况下,我有 5 个 Job 实体,其中包含大约 30 个 JobDetail 实体的列表。一个 JobDetail 包含 850 到 1100 个 JobEnvelope 实体。
写入数据库时,我使用默认的save(Iterable<Job> jobs) 接口方法提交Job 实体列表。所有嵌套实体都有 CascadeType PERSIST。每个实体都有自己的表格。
启用批量插入的常用方法是实现一个自定义方法,如saveBatch,每隔一段时间刷新一次。但在这种情况下,我的问题是JobEnvelope 实体。我不使用JobEnvelope 存储库来保存它们,而是让Jobentity 的存储库处理它。我使用 MariaDB 作为数据库服务器。
所以我的问题归结为以下几点:如何使JobRepository 批量插入它的嵌套实体?
这些是我的 3 个有问题的实体:
工作
@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;
}
【问题讨论】:
标签: java hibernate spring-data-jpa