gpt4 book ai didi

java - Hibernate @OneToMany 连接表抛出 StackOverflowException

转载 作者:行者123 更新时间:2023-12-02 12:09:43 25 4
gpt4 key购买 nike

我正在处理一个 Hibernate 实体关系,其设置如下:

用户可以创建分配。用户可以与其他用户分配任务,为他们分配任务。我的目标是拥有如下用户:

{ id:1,作业:[{name:'test'}],partialAssignment:[{task:'bla'}]}

还有这样的作业:{id:1,用户:{...},分配的用户:[{...}],...}

作业:

    @Entity
@Table(name = "Assignment")
data class Assignment (

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
val id: Long? = null,

@Column(name = "name")
val name: String? = null,

@Column(name = "dueDate")
@Temporal(TemporalType.TIMESTAMP)
val dueDate: Date? = null,

@ManyToOne
@JoinColumn(name = "userId")
var user: User? = null,

@OneToMany(mappedBy = "assignment")
var assignedUsers: List<AssignmentUser> = emptyList()
)

用户

@Entity
@Table(name = "Users")
data class User (

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
@JsonView(UserView.UserSummary::class)
val id: Long? = null,

@Column(name = "email", nullable = false)
@JsonView(UserView.UserSummary::class)
val email: String = "",

@Column(name = "password", nullable = false)
val password: String = "",

@OneToMany(mappedBy = "user")
val assignments: List<Assignment> = emptyList(),

@OneToMany(mappedBy = "user")
val partialAssignment: List<AssignmentUser> = emptyList()
)

分配用户

@Entity
@Table(name = "AssignmentUsers")
data class AssignmentUser(
@Column(name = "task")
val task: String? = null,

@Id
@ManyToOne(cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "userId")
var user: User? = null,

@Id
@ManyToOne(cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "assignmentId")
var assignment: Assignment? = null
) : Serializable {

}

当我使用 JPARepository .findOne(id) 调用获取Assignment 类时,我在Assignment.toString() 方法上收到StackOverflow 异常。我不明白为什么,因为它工作得很好,直到我添加了伪ManyToMany关系(分配的用户)。

有什么想法吗?

最佳答案

这里的问题并不完全是@OneToMany。

在序列化的情况下(在本例中打印对象的字符串形式),指定的代码将进入循环循环。

在所述代码片段中循环关系如下:1. 作业有列表2. 作业有用户3. 用户有列表4. 用户有列表5.AssignmentUser有User6.AssignmentUser有Assignment

在 hibernate 中,所有映射默认设置为 LAZY,因此不会导致问题,因为除非需要,否则我们不会加载关联的对象。

但是,在序列化的情况下,它会尝试加载关联的对象,因此为了打破这个问题,我们需要实现自定义序列化。在您的情况下,您需要正确重写上述对象的 toString 方法,即不应加载不必要的对象。

关于java - Hibernate @OneToMany 连接表抛出 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46627892/

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