多面をページ分割する必要がある Hibernate で 1 対多の関係をマップするにはどうすればよいですか? (つまり、数百以上の関連オブジェクトがあります)
OneToMany アノテーション (またはそれに相当する xml) の使用は役に立ちません。なぜなら、一方のオブジェクトをロードすると関連オブジェクトがすべて取得され、メモリ障害が発生するからです (遅延読み込みを使用していても) .
考えられるアプローチ (私は既に使用しています) は、DAO 実装に getter メソッドを追加することです。これにより、ページネーション パラメーターを導入できます。ただし、カスケードなどの一部の機能が失われるため、これは理想的ではないことがわかります (たとえば、オブジェクトを関連付けるために DAO クラスにセッター メソッドを含める必要があります)。さらに、一面オブジェクトには関連する多面オブジェクトを取得するメソッドがないため、OOP の感覚が失われます。最善の解決策は何ですか?
私の主張をさらに説明するために、次のような関係を持つ 2 つのクラスがあるとしましょう: A には多 B
があります。したがって、結果をページ分割するために、getAllB() メソッドを使用して個別の ADaoImpl クラスを作成します。このクラスには、一度に 1 ページのデータのみを返すページ分割パラメーターを含めることができます。これは正しいです?どんな助けでも大歓迎です。
1 に答える
2
私はあなたが提案しているのと同じことをすると思います.私のdaoに、ページネーションパラメータを取り、指定された結果のページを返す新しいメソッドを作成します. 親オブジェクトに子を保持するかどうかは、あなた次第です。これらのオブジェクトの一時フィールドを作成できます。
public class Parent {
@Transient
private List<Child> children;
}
public class ParentDao {
// Solution 1 - You can keep the parent/child association
public void loadChildren(Parent parent, int firstResult, int maxResults) {
// do your query
parent.setChildren(query.list());
}
// Solution 2 - Or just have your dao directly return the children and remove the list from Parent
public List<Children> getChildren(Parent parent, int firstResult, int maxResults) {
// do your query
return query.list();
}
}
コードに対する OO の感覚を壊すという意味はわかります。しかし実際には、ページネーションはデータ層の機能です。最初の解決策を使用すると、その素敵な「OO」感がいくらか回復する可能性があります。
于 2012-08-17T16:58:44.383 に答える