目前我正在开发一个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
}
答案 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);
}
}