복붙노트

[SPRING] Spring 데이터 JPA @OneToOne 주석 무한 재귀 오류

SPRING

Spring 데이터 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. ==============================

    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
    
  2. from https://stackoverflow.com/questions/45783753/spring-data-jpa-onetoone-annotation-infinite-recursion-error by cc-by-sa and MIT license