在Kotlin中使用JPA双向引用的StackOverflowError

我有以下数据类:

@Entity @Table(name = "SECTIONS") data class Section( @Id @GeneratedValue @Column(name = "ID") var id: Long = 0, @Column(name = "NAME") var name: String = "", @OneToMany( mappedBy = "section", fetch = FetchType.EAGER, cascade = arrayOf(CascadeType.ALL), orphanRemoval = true ) var fields: MutableList<Field> = mutableListOf() ) @Entity @Table(name = "FIELDS") data class Field( @Id @GeneratedValue @Column(name = "ID") var id: Long = 0, @Column(name = "NAME") var name: String = "", @ManyToOne @JoinColumn(name = "SECTION_ID") var section: Section? = null ) 

正如你所看到的,Section和Field之间有一个双向映射。 当我创建一个Section对象,一个Field对象,并将Field对象添加到Section对象中的字段列表中时,它工作正常。 但是,当我也设置字段的部分引用部分对象,然后坚持,我得到一个StackOverflowError:

 @Test fun testCascadeSaving() { val section = Section(name = "Section 1") val field = Field(name = "Field 1") section.fields.add(field) field.section = section val savedSection = sectionRepository.save(section) val savedField = savedSection.fields[0] // This causes an StackOverflowError val f = fieldRepository.findOne(savedField.id) } 

为了使上面的代码正常工作,我必须对field.section = section行进行注释。

任何想法为什么设置双向关系导致这个错误?

实际上,我已经设法解决了这个问题 – 我所要做的只是在至少一个实体中重写toString()方法。 Kotlin提供的实现包括递归地调用彼此的toString()方法,从而导致StackOverflowError

 @Entity @Table(name = "FIELDS") data class Field( @Id @GeneratedValue @Column(name = "ID") var id: Long = 0, @Column(name = "NAME") var name: String = "", @ManyToOne @JoinColumn(name = "SECTION_ID") var section: Section? = null ) { override fun toString(): String { return "Field(id=$id, name=$name)" } } 
Interesting Posts