java - Hibernate @OneToMany 连接表抛出 StackOverflowException

标签 java hibernate spring-boot kotlin

我正在处理一个 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有User 6.AssignmentUser有Assignment

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

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

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

相关文章:

Hibernate 映射资源位于单独的 jar 中

java - 已用堆大小持续增加

java - Hibernate:没有 Activity 事务,createQuery 无效

java - 在应用程序插件中调整 Gradle startScripts

java - 使用 requiredProps 和 fileSets 创建具有自定义参数的 Maven 原型(prototype)

java - 如何使用 Java 代码设置 TextView 的位置?

java - 如何使用eclipse逐行读取android

spring-boot - 在不启用 bean 覆盖的情况下在 Spring Boot 2.1 中连接测试

java - Spring WebClient - 响应时记录 Uri 和方法

spring-boot - 在 Camel SpringBoot 项目中传播请求参数值