给定一个对象,为对象所在列表的所有者查询hibernate的最有效方法是什么

时间:2014-04-09 07:39:24

标签: java hibernate

目前我正在开发一个Web应用程序,我们有以下设置: 一个对象Project,可以包含'Sub'-Project对象列表:

public class Project {
  private long id;
  private List<Project> subProjects;
  ...
  public Set<Project> getSubProjects() { return subProjects }
  public void setSubProjects(Set<Project> subProjects) { this.subProjects = subProjects }
  ...
}

使用Hibernate将其存储在PostgreSQL数据库中

<hibernate-mapping default-access="field" default-lazy="true">
  <class name="Project" table="project">
    <id name="id" type="long">
      <column name="id" not-null="true"/>
      <generator class="native"/>
    </id>
    ...
    <set cascade="all" fetch="select" name="subProjects" batch-size="10">
      <cache usage="read-write"/>
      <key column="projectIdParent"/>
      <one-to-many class="Project"/>
    </set>
    ...
  </class>
</hibernate-mapping>

为了提出问题,一个子项目可以从一个项目转移到另一个项目也是相关的,每个项目都有相同的权利将任何一个项目作为一个子项目。

问题是:获得特定项目的所有“父母”的最强效率方式是什么。

示例:

public class testProject {
  ...
  Project projectA, projectB, projectC, projectD, projectE, projectF, projectG, projectH, projectI;
  projectH.getSubProjects().add(projectF);
  projectD.getSubProjects().add(projectH);
  projectD.getSubProjects().add(projectE);
  projectG.getSubProjects().add(projectD);
  projectC.getSubProjects().add(projectG);
  projectB.getSubProjects().add(projectC);
  projectA.getSubProjects().add(projectB);
  ...
  // Given projectG, get all its ancesters
}

1 个答案:

答案 0 :(得分:1)

您可以在parents类中添加字段Project,以跟踪子项目的每个父项,以便您可以在固定时间内检索它们。

例如,当您将子项目B添加到现有项目A时,只需在B的parents字段中添加对A的引用。这是一个例子(未经测试):

public class Project {
    private long id;
    private List<Project> parents;
    private List<Project> subProjects;

    public void addParent(Project parent) {
        this.parents.add(parent);
    }

    public List<Project> getAllParents() {
        return parents;
    }

    public void addSubProjects(Project child) { 
        subProjects.add(child);
        child.addParent(this);
    }
}