[SPRING] Spring 데이터 JPA @OneToOne 주석 무한 재귀 오류
SPRINGSpring 데이터 JPA @OneToOne 주석 무한 재귀 오류
Husband.java
package com.example.demo.com.example.domain;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.*;
//@Data
//@NoArgsConstructor
//@EqualsAndHashCode
//@ToString
@Entity
@Table(name = "t_husban")
public class Husband {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String job;
@OneToOne
@JoinColumn(name = "wife_fk",referencedColumnName = "id")
private Wife wife;
//omitted getter/setter
}
Wife.java
package com.example.demo.com.example.domain;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.*;
//@Data
//@NoArgsConstructor
@EqualsAndHashCode(exclude = "husband",callSuper = false)
@Entity
@Table(name = "t_wife")
public class Wife {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToOne(mappedBy = "wife",cascade = {CascadeType.ALL})
private Husband husband;
//omitted getter/setter
}
Service.java
@Service
public class TestOneToOneEitherSide {
@Autowired
private WifeRepository wifeDao;
@Autowired
private HusbandRepository husbandDao;
public Husband testCreate() {
Husband husband = husbandDao.findByName("Wang");
return husband;
}
}
Spring 데이터 jpa를 사용하여 데이터베이스에서 남편에게 질의를하면, 결과에서 nfinite 재귀가 발생하며, 다음 그림을 봅니다. @OneToOne 주석을 사용하는 동안 잘못된 것이 있습니까? 또는 주석을 잘못된 방식으로 사용합니다.
사진
해결법
-
==============================
1.이것은 양방향 관계가있을 때 알려진 문제입니다. jackson은 한 쪽의 각 참조를 다른 쪽에서 직렬화하려고 시도하므로 논리적 인 무한 재귀가 발생합니다.
이것은 양방향 관계가있을 때 알려진 문제입니다. jackson은 한 쪽의 각 참조를 다른 쪽에서 직렬화하려고 시도하므로 논리적 인 무한 재귀가 발생합니다.
솔루션 : 거기에 대한 여러 가지 해결책이 있습니다. 한 쪽에서 @JsonIgnore를 사용하여 주석이 달린 참조를 직렬화하는 것을 피할 수 있습니다. 따라서 무한 재귀를 깨뜨릴 수 있습니다.
@EqualsAndHashCode(exclude = "husband",callSuper = false) @Entity @Table(name = "t_wife") public class Wife { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; @OneToOne(mappedBy = "wife",cascade = {CascadeType.ALL}) @JsonIgnore private Husband husband; //omitted getter/setter }
@ JsonManagedReference / @ JsonBackReference를 사용할 수도 있습니다. 자세한 정보는이 링크에서 확인하십시오.
이 답변에는 한 가지 문제가 있습니다. 부인의 방향을 직렬화하려고하면 남편의 객체를 갖지 않을 것입니다. 그 이유는 솔루션이 직렬화되는 것을 피하기 위해서입니다.
이것에 좋은 해결책이 있습니다.이 링크에서 언급 한 아이디어는 상위 엔티티에 대한 참조를 생성하는 것이므로 남편을 직렬화하는 경우 남편 -> 아내 -> [남편 대신 남편 참조] , @JsonIdentityInfo를 사용하여 엔티티에 주석을 추가하기 만하면됩니다.
@EqualsAndHashCode(exclude = "husband",callSuper = false) @Entity @Table(name = "t_wife") @JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id") public class Wife { @JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id") @Entity @Table(name = "t_husban") public class Husband { @Id
from https://stackoverflow.com/questions/45783753/spring-data-jpa-onetoone-annotation-infinite-recursion-error by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3.1 MVC 애플리케이션의 HTTP 상태 404 (0) | 2019.04.30 |
---|---|
[SPRING] 참조하는 Java 프로젝트에서 정적 리소스 (WEB-INF) 폴더의 파일에 액세스하는 방법? (0) | 2019.04.30 |
[SPRING] 단일 파일에 대한 Maven 리소스 필터링 (0) | 2019.04.30 |
[SPRING] Spring에서 setAllowedFields () 메소드 사용하기 (0) | 2019.04.30 |
[SPRING] JBoss AS 7에서 @WebService 주석 스캐닝을 비활성화하는 방법은 무엇입니까? (0) | 2019.04.30 |