2013-05-16 48 views
10

我有兩個實體,一個實體「電影」和一個實體「Clip」 每個片段屬於一個電影,而電影可以有多個片段。Hibernate @OneToMany Relationship在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

「要映射雙向一對多,一對多作爲擁有者,你必須刪除mappedBy元素,並將多個@JoinColumn設置爲可插入和可更新爲false。這個解決方案顯然不是最優化的,並且會產生一些添加更新語句「。

,當我要求電影我得到以下答案:

{ 「ID」:1, 「版本」:1, 「名」: 「MGS演練」, 「文件名」: 「video.mp4」 ,「movieCategories」:[{「id」:1,「version」:1,「name」:「Walkthrough」}],「clips」:[],「description」:「Trailer zu mgs4」}

條目「剪輯」仍然出現。這仍然是錯誤的解決方案,還是我必須忍受這一點?

回答

10

我遇到了完全相同的問題。我嘗試了引用段落中的解決方案,但它並不適合我。

我所做的是在Clip類中爲getMovie()返回null,然後無限循環問題消失了。以JSON格式返回的數據看起來像{「movieId」:1 ... clips:[「clipId」:1,「movie」:「null」,..]}。

如果您還想進一步去除JSON電影屬性,添加類級別的註釋到剪輯類 @JsonSerialize(包括= JsonSerialize.Inclusion.NON_NULL)

Jackson feature: prevent serialization of nulls, default values

更新: 的我發現更簡單的方法就是在Clip類中簡單地刪除電影的getter。

+0

你的更新真的幫了我 – elysch

+0

刪除getter解決了我的問題。謝謝! –

+0

您的更新保存了我的一天! – SuperGirl

1

而不是返回一個實體對象,我建議只返回一個DTO對象與您需要的數據。您可以使用結果轉換器直接從Hibernate查詢/條件結果中獲得一個。

1

正如你所說「入口剪輯仍然出現」。

爲了避免db響應變化fetch = FetchType.EAGERfetch = FetchType.Lazy中的關係數據。

0

解決方案:

使用

@JsonManagedReference註釋用於第一對象實例化

@JsonBackReference註釋對於第二對象實例化

Movie.java

氯ip.java

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