如何以广度优先而不是深度优先的方式将对象保存在spring数据中?

时间:2018-10-31 11:39:28

标签: java spring hibernate recursion spring-data

在Spring Data / Hibernate中保存具有较大递归结构的对象时,出现了StackOverflow错误。

具有递归的结构大致如下:

Schedule -> Contents -> Teachers -> Schedules

时间表类具有:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
public List<Content> getContents() {
...
}

内容类具有:

@ManyToMany(cascade = CascadeType.ALL)
public List<Teacher> getTeachers() {
 ...
}

老师有:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn (nullable = true)
public Schedule getSchedule() {
...
}

为了保存它,我使用:

this.scheduleRepository.save(schedule);

this.scheduleRepositoryCrudRepository的地方。

当时间表较小时,可以毫无问题地保存它。但是,如果安排的时间很长(有很多老师,则会抛出StackOverflow异常。

我知道这不是无限递归,因为当它已经“检查”一个元素时它不会递归,而问题是因为它有太多元素,所以深度对于堆栈存储器来说太大。 / p>

我也知道我可以使用-Xss4096k增加堆栈内存,但是我不知道将来的时间表有多大。我可能会执行的解决方案是手动保存个人,然后手动保存全局对象(基本上是中断递归并手动执行)。

但是,如果Hibernate以广度优先而不是深度优先的方式保存它,则不会使用太多的堆栈内存,因为只有3个级别的递归。但是我不知道是否可能。

所以我的问题是,是否可以配置Spring-data / JPA / Hibernate以广度优先而不是深度优先的方式保存对象级联。

1 个答案:

答案 0 :(得分:0)

我认为您想要的是

@OneToOne(cascade = CascadeType.MERGE)@OneToOne(cascade = CascadeType.PERSIST)