2017-10-12 1 views
2

저는 스프링 데이터 jpa를 사용하여 프로젝트를 빌드하고 있습니다. User 엔터티와 Biz 엔터티가 있습니다.Jpa 엔티티 관계로 인해 무한 루프가 발생했습니다.

@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private UserInformation belongUser;//所属用户 

위의 코드는 Biz 클래스의 일부입니다.

@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser") 
private Set<BizInformation> bizs = new HashSet<BizInformation>(); 

그리고이 사용자 클래스의 일부이다 나는 편안하고 API를 통해 UserInfomation을 얻을 때 문제가

는, 그것이 BizInfo를 반환, 다음은 UserInfomation을 반환 BizInfo 내부, 그리고 마지막으로 유래 예외를 발생 .

어떻게 해결할 수 있습니까? 감사.

+0

어딘가에 무한 루프하지만 당신은 말을하지 않습니다. 이것은 JPA API와 전혀 관련이없는 JSON입니다. – DN1

+0

@ DN1 알려진 JSON serialiser 비헤이비어입니다 (많은 사람들이 말합니다 : 오류, 기타 : 기능) –

답변

2

이 문제는 양방향 관계로 인해 발생합니다. 일반적으로 직렬화됩니다 한 - 당신은

  • @JsonManagedReference는 참조의 전방 부분 @JsonManagedReference@JsonBackReference를 사용할 수 있습니다.
  • @JsonBackReference는 참고 문헌의 뒷부분입니다. 의 직렬화가 생략됩니다. 귀하의 경우

당신은 사용자 클래스에 @JsonManagedReference을 추가 할 수 있습니다

@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser") 
@JsonManagedReference 
private Set<BizInformation> bizs = new HashSet<BizInformation>(); 

및 @JsonBackReference UserInformation 직렬화를 생략합니다 비즈 클래스

@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
@JsonBackReference 
private UserInformation belongUser;//所属用户 

당신은 또한에 대한 @JsonIgnore을 사용할 수 있습니다 직렬화를 생략하려는 클래스

자세한 내용 : jackson-bidirectional-relationships-and-infinite-recursion

+0

좋은 질문과 답변 더 – Acewin

+1

이것은 매우 일반적인 시나리오입니다. 엔터티를 json으로 마샬링/언 마샬링하려고하는 사람들은 일반적으로 루프를 잊어 버립니다. – Acewin

+1

아주 좋은 답변, 완벽하게 작동합니다, 도움 주셔서 감사합니다. – zpwpal

1

또 다른 방법은 @JsonIgnoreProperties을 사용하는 것입니다

@JsonIgnoreProperties("bizs") 
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private UserInformation belongUser; 
관련 문제