StackOverflowError с двунаправленными ссылками JPA в Котлине

У меня есть классы данных:

@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 и я добавляю объект Field в список полей объекта Section, он отлично работает. Однако, когда я также устанавливаю ссылку раздела 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)" } }