Hibernate分页OneToMany关系

时间:2012-08-17 15:23:52

标签: hibernate hibernate-onetomany

如何在Hibernate中映射一对多关系,其中多方需要进行分页? (即你有数百个或更多的相关物品)
使用OneToMany注释(或其xml等效项)是没有用的,因为加载单侧对象会检测所有相关对象导致内存灾难(即使您使用延迟加载)。
一种可能的方法(我已经在使用)是在DAO实现中添加一个getter方法,您可以在其中引入分页参数。但是,我可以看到这并不理想,因为你丢失了一些像cascading这样的功能(例如,我必须在DAO类中包含setter方法来关联对象)。此外,您失去了一些OOP意识,因为单侧对象没有检索其相关多方对象的方法。什么是最好的解决方案?
为了进一步阐明我的观点,让我们说我有两个类别,它们之间有以下关系:A有很多B.
我不能使用OneToMany注释编写A.getAllB()方法,因为有数百个B与A相关。因此,为了对结果进行分页,我使用getAllB()方法创建一个单独的ADaoImpl类,我可以在其中包含分页参数一次只返回一页数据。它是否正确?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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”感觉。