Hibernate分页的OneToMany关系

5
如何在Hibernate中映射一个一对多的关系,其中多方需要分页?(即,您有数百个或更多相关对象)使用OneToMany注释(或其xml等效物)是无用的,因为加载一个一侧对象会检索它的所有相关对象,从而导致内存灾难(即使您使用延迟加载)。可能的方法(我已经在使用中)是在DAO实现中添加一个getter方法,您可以在其中引入分页参数。然而,我可以看到这不是理想的,因为您会失去一些功能,例如级联(例如,我必须在DAO类中包含setter方法来关联对象)。此外,您会失去一些面向对象编程的意义,因为一侧对象没有检索其相关多侧对象的方法。什么是最好的解决方案?为了进一步说明我的观点,假设我有两个类,它们之间有以下关系:A拥有许多B。我无法使用OneToMany注释编写一个A.getAllB()方法,因为与A相关的B有数百个。因此,要分页结果,我创建一个单独的ADaoImpl类,并在其中包含getAllB()方法,以便可以包含分页参数以每次仅返回一页数据。这样做正确吗?任何帮助将不胜感激。
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();
    }
  }

我知道你所说的打破代码面向对象的感觉。但实际上,分页是数据层的一个功能。选择第一种解决方案可能会恢复一些不错的“面向对象”感觉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接