2013-05-16 10 views
10

エンティティ「ムービー」とエンティティ「クリップ」 各クリップは1つのムービーに属し、ムービーには複数のクリップが含まれます。Hibernate @OneToManyの関係が原因でJSON結果の無限ループまたは空のエントリが返される

私のコードは次のようになります。テーブルが生成され、各クリップが列「movie_id」を持っていますが、これは私がデータ

を要求していたときに私のアプリケーションが無限ループで終わるになり

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; 

@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に設定しても機能しませんでした。

編集:私はこの記事を読んで、これを "解決"

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

を「双方向をマップするには、私は現在のJBossの開発スタジオに

Editを使用しています1対多の、1対多のサイドを所有サイドとして使用する場合は、mappedBy要素を削除し、many to one @JoinColumnをinsertableおよびupdatableとしてfalseに設定する必要があります。 itional UPDATEステートメント。 "

私は映画を要求したとき、私は次のような答えを得る: "名前" 1: "MGSチュートリアル"、 "ファイル名": "video.mp4" を

{ "ID":1、 "バージョン" 、 "movieCategories":[{"id":1、 "version":1、 "name": "ウォークスルー"}]、 "クリップ":[]、 "description": "Trailer zu mgs4"}

エントリ「クリップ」が表示されます。これはまだ間違った解決策ですか、それとも私はこのままで生きなければなりませんか?

答えて

10

全く同じ問題が発生しました。私は引用された段落から解決策を試して、それは私のために働いていない。

私がしたのは、ClipクラスのgetMovie()に対してnullを返すことです。その後、無限ループの問題はなくなりました。 JSON形式で返されるデータは、{"movieId":1 ...クリップ:["clipId":1、 "movie": "null"、..]}のようになります。

あなたはさらに、JSONで映画のプロパティを削除し、クラス @JsonSerialize(= JsonSerialize.Inclusion.NON_NULLを含んに)

Jackson feature: prevent serialization of nulls, default values

をクリップするために、クラスレベルの注釈を追加したい場合はアップデート: 簡単に私が見つけたのは、Clipクラスのムービーのゲッターを単に削除することです。

+0

あなたのアップデートが本当に助けてくれました – elysch

+0

ゲッターを削除すると私の問題が解決しました。ありがとう! –

+0

更新が保存されました! – SuperGirl

1

Entityオブジェクトを返す代わりに、必要なデータだけを含むDTOオブジェクトを返すことをお勧めします。結果トランスフォーマーを使用して、Hibernateクエリー/基準結果から直接1つを取得できます。

1

「エントリクリップはまだ表示されています」と言っています。

db応答での関係データの変更を避けるにはfetch = FetchType.EAGERfetch = FetchType.Lazy

0

対処:

使用

@JsonManagedReference最初のオブジェクトのための注釈は、第二のオブジェクトの

@JsonBackReference注釈が

Movie.java

Clでインスタンス化インスタンス化ip.java

@JsonBackReference 
@ManyToOne 
    @JoinColumn(name="movie_id") 
    private Movie movie; 
関連する問題