オブジェクトのすべてのプロパティを再帰的に再帰的に初期化するために、休止状態で1つの関数を作成しているため、オブジェクトグラフ全体がロードされます。
これを使用する必要がある2つの複雑なシナリオがあります
1) カテゴリやサブカテゴリのような自己複合オブジェクト ...
@Entity
public class Category {
@Column(nullable = false, length = 50)
@NotNull
@Size(max = 50, message = "{50}")
protected String name;
@ManyToOne(targetEntity = Category.class, fetch = FetchType.LAZY, optional = true)
private Category parentCategory;
}
2) 使用前に初期化するオブジェクトが多数ある複雑なオブジェクト グラフ。
問題は、選択的なケースでのみこのオブジェクト グラフ全体が必要なため、熱心なフェッチを使用できないことです。また、コードを一般化する必要があるため、オブジェクトの HQL クエリを記述する必要はありません。
私はこれのために部分的なコードを書きました、
public void recursiveInitliaze(Object obj) throws Exception {
if(!Hibernate.isInitialized(obj))
Hibernate.initialize(obj);
PropertyDescriptor[] properties = PropertyUtils.getPropertyDescriptors(obj);
for (PropertyDescriptor propertyDescriptor : properties) {
Object origProp = PropertyUtils.getProperty(obj, propertyDescriptor.getName());
if (origProp != null) {
this.recursiveInitliaze(origProp);
}
if (origProp instanceof Collection && origProp != null) {
for (Object item : (Collection) origProp) {
this.recursiveInitliaze(item);
}
}
}
}
ただし、1 つの問題があります。双方向の関係が原因で、メソッド呼び出しのスタック オーバーフローが発生します。双方向の関係があることを検出する方法、またはこれを実装するより良い方法はありますか?
フェッチ プロファイルも役立つと思いますが、プロジェクトの現在の段階でフェッチ プロファイルを構成するのは難しいため、可能であればこれを実装したいと考えています。