Spring

Spring - JPA @OneToMany java.lang.StackOverflowError: null

codeManager 2022. 11. 4. 19:31
반응형

 

Caused by: java.lang.StackOverflowError: null

 

JPA에서 @OneToMany로 두 엔티티간 join을 걸어줄 경우에 StackOverflowError가 발생하는 경우가 있습니다.

 

@Data
@Entity
public class Person {

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person", cascade = CascadeType.REMOVE)
    private List<Phone> phoneList;
    
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person", cascade = CascadeType.REMOVE)
    private List<Car> carList;

}

 

@Data
@Entity
public class Phone {

    @ManyToOne
    @JoinColumn(name="person_id")
    private Person person;

    @Column(name = "number")
    private String number;
}

 

에러 위치가 @Data annotation에서 발생하는데 이유는 @Data에서 toString()을 호출하기 때문입니다.

 

Person의 phoneList에서 toString() 호출하고 Phone에서 person toString 호출하고 이렇게 순환참조가 걸려서 StackOverflowError가 발생합니다.

 

 

해결방법은 

 

 

1. 

@EqualsAndHashCode(callSuper = false, exclude = "person")

으로 특정 필드를 제외하면 됩니다.

@Data
@Entity
@EqualsAndHashCode(callSuper = false, exclude = "person")
public class Phone {

    @ManyToOne
    @JoinColumn(name="person_id")
    private Person person;

    @Column(name = "number")
    private String number;
}

 

2. 

person 필드에  @ToString.Exclude annotation을 써주면 됩니다.

@Data
@Entity
public class Phone {

    @ManyToOne
    @JoinColumn(name="person_id")
    @ToString.Exclude
    private Person person;

    @Column(name = "number")
    private String number;
}

 

 

반응형