Hibernate Criteria Query for Self Referencing Entity; 错误的结果
我有一个自我参照的实体Department
,可以有子Departments
(n级)。 Hibernate Criteria Query似乎越来越困惑。 它正确地创造了一棵树,因为所有的父母都有他们的正确的孩子,但是它也任意地将孩子直接归于祖父母,所以父母最终得到了孩子(这是正确的)和孩子的孩子(不正确)它。
有一个顶级实体Organization
,它可以有n个LoB
实体。 Lob代表业务线。 在每个LoB
有一个Department
实体的层次结构。
组织:
public class Organization {
...
private Set<Lob> lobs = new HashSet<Lob>();
@OneToMany(mappedBy = "organization", cascade = { CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REMOVE })
public Set<Lob> getLobs() {
return lobs;
}
public void setLobs(Set<Lob> lobs) {
this.lobs = lobs;
}
}
高球:
public class Lob {
...
private Long id;
private Organization organization;
private Set<Department> departments = new HashSet<Department>();
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ORG_ID", nullable = false)
public Organization getOrganization() {
return organization;
}
public void setOrganization(Organization organization) {
this.organization = organization;
}
@OneToMany(mappedBy = "lob", cascade = { CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REMOVE })
public Set<Department> getDepartments() {
return departments;
}
public void setDepartments(Set<Department> departments) {
this.departments = departments;
}
}
部:
public class Department {
...
private Set<Department> children = new HashSet<Department>();
private Department parent;
private Lob lob;
@OneToMany(mappedBy = "parent")
public Set<Department> getChildren() {
return children;
}
public void setChildren(Set<Department> children) {
this.children = children;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID")
public Department getParent() {
return parent;
}
public void setParent(Department parent) {
this.parent = parent;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "LOB_ID")
public Lob getLob() {
return lob;
}
public void setLob(Lob lob) {
this.lob = lob;
}
}
Hibernate标准查询:
Session session = (Session) getEntityManager().getDelegate();
Criteria crit = session.createCriteria(Organization.class);
// Get the whole Org tree
org = (Organization) crit.createAlias("lobs", "l", Criteria.LEFT_JOIN)
.setFetchMode("l", FetchMode.JOIN)
.createAlias("l.departments", "d", Criteria.LEFT_JOIN)
.setFetchMode("d", FetchMode.JOIN)
.createAlias("d.children", "dc", Criteria.LEFT_JOIN)
.setFetchMode("dc", FetchMode.JOIN)
.add(Restrictions.eq("id", orgId))
.uniqueResult();
我不确定是否映射了自引用关联权。 任何帮助将不胜感激。
你已经映射了部门设置的方式,所有引用Lob的部门都在集合中,但整棵树引用的Lob不仅仅是顶部。 所以你必须将该限制添加到设置的映射中。 使用休眠它会
<set name="departments" where="parent_id IS NULL">
<key column="LOB_ID" />
<one-to-many class="Department" />
</set>
也许别人可以编辑添加相应的注释
链接地址: http://www.djcxy.com/p/37077.html上一篇: Hibernate Criteria Query for Self Referencing Entity; incorrect result