相关疑难解决方法(0)

Spring Data JPA:嵌套实体的批量插入

我有一个测试用例,我需要将100'000个实体实例保存到数据库中.我目前正在使用的代码执行此操作,但最多需要40秒才能将所有数据保留在数据库中.从JSON文件中读取数据,该文件大小约为15 MB.

现在我已经在自定义存储库中为另一个项目实现了批量插入方法.但是,在这种情况下,我有很多顶级实体要坚持,只有几个嵌套实体.

在我目前的情况下,我有5个Job实体,其中包含约30个JobDetail实体的列表.一个JobDetail包含850到1100个JobEnvelope实体.

写入数据库时​​,我Job使用默认save(Iterable<Job> jobs)接口方法提交实体列表.所有嵌套实体都具有CascadeType PERSIST.每个实体都有自己的表.

启用批量插入的常用方法是实现一个自定义方法,例如saveBatch每隔一段时间刷新一次.但在这种情况下我的问题是JobEnvelope实体.我不会将它们与JobEnvelope存储库保持一致,而是让Job实体的存储库处理它.我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

的JobDetail

@Entity
public class JobDetail {
  @Id
  @GeneratedValue
  private int jobDetailId;

  @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
  @JoinColumn(name = "jobId")
  @JsonBackReference
  private …
Run Code Online (Sandbox Code Playgroud)

java hibernate spring-data-jpa

8
推荐指数
1
解决办法
9433
查看次数

Spring Boot JPA 批量插入

我有 3 个实体父、子、子子。Parent 是 Child 的父级,而 Child 是 SubChild 的父级。我需要插入大约 700 个 Parent 对象。父级可以拥有 50 个子级对象。Child 可以有 50 个 SubChild 对象。我尝试正常,repository.save(ListOfObjects)大约需要 4 分钟。

然后我尝试使用实体管理器persistflushclear基于批量大小(500)。这也花费了大约 4 分钟。性能上没有太大差异。请建议一种有效插入如此大量数据的最佳方法。

家长

@Entity
public class Parent {
@Id @GeneratedValue(strategy= GenerationType.AUTO)
private Long parentId;
private String aaa;
private String bbb;
private String ccc;
@Version
private Long version;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent", fetch = FetchType.LAZY)
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column=@JoinColumn(name="parentId",referencedColumnName="parentId",nullable=false))})
private List<Child> childs = new ArrayList<>();
public …
Run Code Online (Sandbox Code Playgroud)

jpa spring-data-jpa spring-boot hibernate-batch-updates

6
推荐指数
1
解决办法
1万
查看次数

为什么被刷新的对象数量应该等于 hibernate.jdbc.batch_size?

正如hibernate 文档所说,当进行批量插入/更新时,当对象数量等于 jdbc 批量大小 ( hibernate.jdbc.batch_size)时,会话应该被刷新和清除。我的问题是为什么这个数字应该等于hibernate.jdbc.batch_size. 有性能提示吗?
编辑: 例如,认为我hibernate.jdbc.batch_size在 hibernate.cfg 文件中将 设置为 30。然后正如文档所说,当对象计数等于 30 时应该刷新会话。为什么我不应该在对象计数为 20 或 40 时刷新?

hibernate jdbc batch-processing

3
推荐指数
1
解决办法
1501
查看次数

如何在更新之前强制Hibernate删除孤立

假设我有以下模型结构:

@Entity
@Table(....)
public class AnnotationGroup{
    ...
    private List<AnnotationOption> options;


    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(name = "annotation_group_id", nullable = false)
    public List<AnnotationOption> getOptions() {
        return options;
    }
}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Table(...)
public class AnnotationOption {

    private Long id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Override
    public Long getId() {
        return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,我有group1AnnotationOption小号opt1 opt2opt3

然后我想用一个选项替换所有选项 opt1

在此输入图像描述

另外我在数据库中有约束:

    CONSTRAINT "UQ_ANNOTATION_OPTION_name_annotation_group_id" UNIQUE (annotation_option_name, annotation_group_id)
Run Code Online (Sandbox Code Playgroud)

这一个火上浇油:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa constraints unique

3
推荐指数
2
解决办法
980
查看次数