2017-10-08 9 views
0

は、私は次のように設定されている休止実体関係に働いてスロー:休止@OneToManyは、テーブルに参加StackOverflowExceptionが

ユーザーが割り当てを作成することができます。ユーザーは割り当てを他のユーザーと分けて、タスクを与えることができます。

{ID:1、割り当て:[{名: 'テスト'}]、partialAssignment:[{タスク 'BLA'}]}私の目標は以下の通りであるユーザ有することである

およびこのような割り当て: {ID:1、ユーザー:{...}、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.toString()メソッドのStackOverflowの例外を取得します。なぜ私は偽のManyToMany関係(assignedUsers)を追加するまでうまくいったので、私は理解していない。

どのような考えですか?

答えて

1

ここで@OneToManyに問題はありません。

シリアル化(この場合、オブジェクトの文字列形式)の場合、指定されたコードは循環ループになります。

記載されたコードスニペット環状関係は以下の通りであり: 1.割り当てリスト 2 Assignementは、ユーザがリスト 4.ユーザがリスト 5 AssignmentUserがユーザー 6 AssignmentUser割り当てを有するを有するを有し有するユーザ 3を有しています

すべてのマッピングはデフォルトでLAZYに設定されているため、必要な場合を除き、関連付けられたオブジェクトはロードされません。

しかし、シリアル化の場合、関連するオブジェクトをロードしようとします。したがって、これを破るためにカスタムシリアル化を実装する必要があります。あなたの場合、上記のオブジェクトのtoStringメソッドを適切にオーバーライドする必要があります。つまり、オブジェクトを不必要にロードしないでください。

+0

私はオブジェクトをまだシリアル化しようとしていません。ちょうどそれをフェッチしてください。私はなぜJpaRepositoryがtoString()を呼び出しているのか理解できません。 – pokemans

+0

これは動作します、私はちょうどなぜこれを行うのか分かりません。 – pokemans

+0

このオブジェクトをビューに送信し、javascriptで使用すると、ビューエンジン(thymeleaf?)はオブジェクトをシリアライズします。 – sedooe

関連する問題