2013-05-16 3 views
10

엔티티 "영화"와 엔티티 "클립"이 있습니다 각 클립은 하나의 영화에 속하며 영화에는 여러 클립이있을 수 있습니다.Hibernate @OneToMany 관계로 인해 JSON의 무한 루프 또는 빈 항목이 생깁니다.

Movie.java 
    @OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<Clip> clips = new HashSet<Clip>(); 



Clip.java 

    @ManyToOne 
     @JoinColumn(name="movie_id") 
     private Movie movie; 

테이블 생성되고 있으며, 각 클립 열 "movie_id"을 가지고 있지만 이것은 내가 데이터

요청있을 때 무한 루프에 결국 내 응용 프로그램을 발생합니다

내 코드처럼 보이는

@Path("/{id:[0-9][0-9]*}") 
     @GET 
     @Produces(MediaType.APPLICATION_JSON) 
     public Movie lookupMovieById(@PathParam("id") long id) { 
      return em.find(Movie.class, id); 
     } 


result: 
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"M... 

클립을 요청할 때와 같은 결과입니다.

@ManyToMany 관계로 변경하면 아무런 문제가 없지만 여기에 필요한 것은 아닙니다. 나 좀 도와 줄 수있어? fetchType을 Lazy로 설정하면 작동하지 않습니다.

편집 : 현재 JBoss의 개발 스튜디오를 사용하고

편집 :

나는 "해결"

이이 문서 읽어 :

http://blog.jonasbandi.net/2009/02/help-needed-mapping-bidirectional-list.html

"양방향 매핑하기를 one to many 측면을 소유 측으로 사용하는 경우 mappedBy 요소를 제거하고 삽입 가능 및 업데이트 가능으로 many to one @JoinColumn을 false로 설정해야합니다.이 솔루션은 분명 최적화되지 않았으며 일부 추가 기능을 생성합니다 itional UPDATE 문. "

나는 나는 다음과 같은 답변을 얻을 영화 요청할 때 :

{ "ID를"1 "버전": 1, "이름": "MGS 연습", "파일 이름": "video.mp4" , "movieCategories": [{ "id": 1, "version": 1, "이름": "연습"}], "클립": [], "설명": "예고편 zu mgs4"}

"클립"항목이 계속 나타납니다. 이것은 여전히 ​​잘못된 해결책입니까 아니면 이걸로 그냥 살아야합니까?

답변

10

정확히 같은 문제가 발생했습니다. 내가 인용 단락에서 해결책을 시도, 그것은 나를 위해 작동하지 않았다.

내가 한 것은 Clip 클래스에서 getMovie()에 대해 null을 반환하면 무한 루프 문제가 해결되었습니다. JSON 형식으로 반환 된 데이터는 { "movieId": 1 ... clip : [ "clipId": 1, "movie": "null", ..]}처럼 보입니다.

경우도 더 클래스 @JsonSerialize를 (포함 = JsonSerialize.Inclusion.NON_NULL) 클립, JSON에서 동영상의 속성을 제거 클래스 레벨의 주석을 추가 할

Jackson feature: prevent serialization of nulls, default values

업데이트 : 내가 발견 한 쉬운 방법은 단순히 Clip 클래스에서 동영상의 getter를 제거하는 것입니다.

+0

업데이트가 정말 도움이되었습니다. – elysch

+0

게터를 제거하면 제 문제가 해결되었습니다. 감사! –

+0

내 업데이트가 저장되었습니다. – SuperGirl

1

Entity 개체를 반환하는 대신 필요한 데이터로만 DTO 개체를 반환하는 것이 좋습니다. 결과 변환기를 사용하여 Hibernate 질의/criteria 결과로부터 직접 하나를 얻을 수있다.

1

"입력 클립이 계속 표시됩니다."

데이터베이스 응답의 관계 데이터가 fetch = FetchType.EAGER에서 fetch = FetchType.Lazy으로 변경되는 것을 방지하려면 다음을 수행하십시오.

0

솔루션 :

를 사용하여 첫 번째 개체에 대한

@JsonManagedReference 주석은 두 번째 개체에 대한

@JsonBackReference 주석이 Movie.java

@JsonManagedReference 
@OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<Clip> clips = new HashSet<Clip>(); 

CL

의 인스턴스를 인스턴스화 ip.java

@JsonBackReference 
@ManyToOne 
    @JoinColumn(name="movie_id") 
    private Movie movie;