2016-07-27 10 views
2

私はモデルカテゴリを持っています。親カテゴリーとサブカテゴリーのリストを持つことがあります。私は、エンティティが自分自身に関係するケースを見つけることができなかったので、この質問を書いた。FetchType.Lazyが動作しないのはなぜですか?

parent { 
id 
parent: null 
childs { 
    child { 
     id 
     parent: ...lazy loading exception... 
     childs: null 
    } 
} 
} 

しかし、上の子モデルで:私はのようなものを見ることが予想

Category parent = new Category(); 
parent.setName("parent"); 

Category child1 = new Category(); 
child1.setName("child1"); 
child1.setParent(parent); 

parent.getSubcategories().add(child1); 

categoryPersistence.save(parent); 

@Entity 
public class Category { 
@Id 
private String id; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "parent_id") 
private Category parent; 

@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) 
private List<Category> subcategories = Lists.newArrayList(); 
} 

私のようなエンティティを保存します。

は、私はこのようにそれを実装しようとしました私は再帰的ループを持っています。 それを防ぐには?

ええ、私も@JsonIgnoreを使用しました。しかし、私はそれが良い習慣であるかどうかは分かりませんでした しかし、私は1つのカテゴリが必要な場合があり、私は本当に親とUIにそれを送信する必要があります。 @JsonIgnoreはこれを作成できますか?

+0

実際のオブジェクトを取得するメソッドでは、パラメータで 'referenced'というブール値を持つことができます。ブール値は、オブジェクトが自己を呼び出すとtrueに設定されます。そして、構築中に、 'if(!referenced){...'}をチェックして、再帰的ループを回避して参照を1回だけ得ることができます。 – ghoulfolk

答えて

0

私も同じ問題に悩まされてきたが、問題が1または半分の時間をデバッグ、私はあなたのフィールドの自動JSON生成ゲッターが呼ばなっている間に、あなたの親フィールドは、遅延ロードしても

を考え出し@damienMiheevいくつかの周期的な実行を作成している値をフェッチしています。 これは、親をフェッチしてから子をフェッチし、子コレクション内のすべての子に対して親を再度取得し、StackOverflowsまでこのプロセスを続行するためです。ここで

あなたが「親」jsonの世代から、例えばを除外すべきであるあなたの問題の解決策ですそのフィールドを@JsonIgnoreとしてマークすることができます。 hashCode()、equals()およびtoString()メソッドに親と子を含めないでください。

関連する問題