2012-08-17 8 views
5

多辺のページ付けが必要なHibernateで1対多の関係をマップするにはどうすればよいですか?
OneToManyアノテーション(またはその相当するxml相当)を使用すると、片側オブジェクトを読み込むと関連するオブジェクトがすべて取得され、メモリ惨事の原因となるため、便利です(lazy読み込み)。
可能なアプローチ(既に使用しています)は、DAO実装にゲッターメソッドを追加することです。そこではページネーションパラメータを導入できます。しかし、カスケーディングのようないくつかの機能を失うため、これは理想的ではありません(たとえば、オブジェクトを関連付けるためにDAOクラスにsetterメソッドを含める必要があります)。また、一方のオブジェクトには関連するmany-sideオブジェクトを取得するメソッドがないため、いくつかのOOPの意味が失われます。最高のソリューションは何ですか?
私はさらに2つのクラスを持っているとしましょう。A has-many B.
OneToManyアノテーションを使用してA.getAllB()メソッドを書くことはできません。したがって、結果に改ページを行うには、getAllB()メソッドを使用して別のADaoImplクラスを作成します。このメソッドでは、一度に1ページのデータだけを返すページネーションパラメータを含めることができます。これは正しいです?どんな助けもありがとう。HibernateでページングされたOneToMany関係

答えて

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」感覚の一部を回復する可能性があります。

関連する問題