-
Spring - JPA @OneToMany java.lang.StackOverflowError: nullSpring 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; }
반응형'Spring' 카테고리의 다른 글
Spring - Resilience4j circuit breaker example (0) 2024.01.09 Spring - JPA Executing an update/delete query 에러 (0) 2023.10.17 Spring - JPA cannot simultaneously fetch multiple bags (0) 2022.11.04 Spring - LazyInitializationException: could not initialize proxy – no Session (1) 2022.09.20 Spring - static 변수에 @Value 어노테이션 적용 (0) 2022.09.05