2016-04-25 49 views
0

以下にいくつかのドメインを作成しました。JPAでの無限再帰参照OneToMany、ManyToOne関係

@Entity 
public class Conference { 

    ... 

    @OneToMany(
     targetEntity = ProgramDate.class, 
     mappedBy = "conference", 
     cascade = CascadeType.REMOVE, 
     fetch = FetchType.EAGER 
    ) 
    @JsonBackReference 
    private List<ProgramDate> programDateList; 
} 

@Entity 
public class Program { 

    ... 

    @ManyToOne 
    @JoinColumn(name = "program_date_id") 
    @JsonBackReference 
    private ProgramDate date; 

    @ManyToOne 
    @JoinColumn(name = "room_id") 
    private Room room; 
    ... 
} 

@Entity 
public class ProgramDate { 

    ... 

    @OneToMany(
      targetEntity = Program.class, 
      mappedBy = "date", 
      fetch = FetchType.EAGER 
    ) 
    @JsonBackReference 
    private List<Program> programList; 

    @ManyToOne 
    @JoinColumn(name = "conference_id") 
    private Conference conference; 
} 

@Entity 
public class Room { 

     ... 

    @OneToMany(
      targetEntity = Program.class, 
      mappedBy = "room", 
      fetch = FetchType.EAGER 
    ) 
    @JsonBackReference 
    private List<Program> programList; 
} 

私は以下のコードのようにフリーメーカを作った。

 <#list conference.programDateList as date> 
     ... 
    </#list> 

私は、JPA OneToMany、ManyToOne関係での無限再帰参照である問題を抱えています。 @JsonBackReferenceを追加しようとしましたが、jsonの再帰的な問題についてのみ解決しました。

enter image description here

+0

JPAの無限再帰問題はどこにありますか? JPAはオブジェクトアイデンティティを持っているため、双方向関係で複数のエンティティを処理することはなく、単一のルートエンティティだけを読み込もうとすると巨大なオブジェクトグラフを取り込むのを軽減するための遅延フェッチが可能です。あなたの問題はオブジェクトモデルのシリアライズであると仮定し、JsonBackReferenceアノテーションを使用している場合は、このシリアライズによって問題が発生します。 JsonManagedReferenceとJsonBackReferenceを使用していることを示すhttp://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursionを参照してください。 – Chris

+0

@Chris上記のような会議でループプログラムの日付を使用すると発生します。日は再帰的です。私はJsonManagedReferenceとJsonBackReferenceを使用しようとしますが、上記のような再帰問題があります。 – egaoneko

+0

また、その再帰はJPAとは関係がないようであり、JsonBackReferenceはJPAアノテーションではありません。あなたのJsonBackReferenceアノテーションは、Json再帰問題をどのように解決しましたか?問題は何ですか?データを読むとき、この問題はどこに現れますか?シリアル化する前にデータをチェックしてください。モデルのJPAとの相互作用に問題があり、シリアル化以外の遅延関係が発生することは本当に疑問です。 – Chris

答えて

0

あなたが会議でルーム& Programdateを含んなぜ、その後、プログラムにルーム&すでに会議に含まれるべきProgramdateに沿って会議を追加しますか?次に、ProgramDateには、会議とプログラムのリストの別の参照があります。

基本的には、これらのループからいくつかの魅力的な注釈を「ハック」させてはいけませんが、データモデル。会議は大丈夫ですが、プログラムは会議のリストのみになり、Programdateは日付にする必要があります。

+0

アドバイスをいただきありがとうございます。私は自分のコードを編集しようとします。会議室とプログラムを削除します。また、私は部屋とプログラムでの会議を削除します。だから、私はプログラムの再帰を解決します。しかし、ProgramDateにはまだ新しい画像のような再帰問題があります。 :( – egaoneko

関連する問題