簡體   English   中英

休眠@OneToMany聯接表拋出StackOverflowException

[英]Hibernate @OneToMany join table throws StackOverflowException

我正在建立如下的休眠實體關系:

用戶可以創建分配。 用戶可以與其他用戶拆分任務,從而為他們分配任務。 我的目標是擁有如下用戶:

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

分配如下:{id:1,user:{...},AssignedUsers:[{...}],...}

分配:

    @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()
)

AssignmentUser

@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異常。 我不明白為什么,因為在我添加psuedo ManyToMany關系(assignedUsers)之前,它工作得很好。

有什么想法嗎?

@OneToMany並不是問題所在。

如果進行序列化(在這種情況下為打印對象的字符串形式),則說明的代碼將循環循環。

在所述代碼段中,循環關系如下:1.分配具有列表2.分配具有用戶3.用戶具有列表4.用戶具有列表5. AssignmentUser具有用戶6. AssignmentUser具有Assignment

在休眠狀態下,所有映射默認情況下都設置為LAZY,因此不會造成問題,因為除非需要,否則我們不會加載關聯的對象。

但是,在序列化的情況下,它將嘗試加載關聯的對象,因此,要打破這一點,我們需要實現自定義序列化。 在您的情況下,您需要正確地覆蓋上述對象的toString方法,即,不應不必要地加載對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM