gpt4 book ai didi

java - StackOverflowError 与 Kotlin 中的 JPA 双向引用

转载 作者:行者123 更新时间:2023-11-30 07:51:24 24 4
gpt4 key购买 nike

我有如下数据类:

@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 对象中的字段列表时,它工作正常。但是,当我也将 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)"
}
}

关于java - StackOverflowError 与 Kotlin 中的 JPA 双向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47127427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com