在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.scheduleRepository
是CrudRepository
的地方。
当时间表较小时,可以毫无问题地保存它。但是,如果安排的时间很长(有很多老师,则会抛出StackOverflow异常。
我知道这不是无限递归,因为当它已经“检查”一个元素时它不会递归,而问题是因为它有太多元素,所以深度对于堆栈存储器来说太大。 / p>
我也知道我可以使用-Xss4096k
增加堆栈内存,但是我不知道将来的时间表有多大。我可能会执行的解决方案是手动保存个人,然后手动保存全局对象(基本上是中断递归并手动执行)。
但是,如果Hibernate以广度优先而不是深度优先的方式保存它,则不会使用太多的堆栈内存,因为只有3个级别的递归。但是我不知道是否可能。
所以我的问题是,是否可以配置Spring-data / JPA / Hibernate以广度优先而不是深度优先的方式保存对象级联。
答案 0 :(得分:0)
我认为您想要的是
@OneToOne(cascade = CascadeType.MERGE)
或
@OneToOne(cascade = CascadeType.PERSIST)