【问题标题】:Hibernate Criteria Query for Self Referencing Entity; incorrect result自引用实体的休眠条件查询;结果不正确
【发布时间】:2012-11-05 16:05:07
【问题描述】:

我有一个自引用实体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;
}
}

LOB:

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;
}
}

休眠条件查询:

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();

我不确定我是否正确映射了自引用关联。 任何帮助将不胜感激。

【问题讨论】:

    标签: hibernate jpa hibernate-criteria


    【解决方案1】:

    您已经映射了部门集,即所有引用 Lob 的部门都在集合中,但整个树不仅引用了顶部,还引用了同一个 Lob。因此,您必须将该限制添加到集合映射中。使用休眠它会是

    <set name="departments" where="parent_id IS NULL">
      <key column="LOB_ID" />
      <one-to-many class="Department" />
    </set>
    

    也许其他人可以编辑添加相应的注释

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      相关资源
      最近更新 更多