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;
}
반응형