具有相同类的JPA父/子,检索问题

时间:2011-12-27 21:09:38

标签: hibernate jpa parent-child data-retrieval

我有一个问题,检索类型为“文件夹层次结构”的父/子关系理想情况下,在普通的Oracle SQL中,使用CONNECT BY子句会很容易。但是对于Hibernate来说,有些原因最终会导致Double“LEFT OUTER JOIN”父母对孩子和孩子对父母。

问题:当hibernate拉动“Dashboard”文件夹的对象在“Cartersian product”中检索时,它会拉出父/子,但它也会将相同的子文件夹附加到Dashboard!。

以下是更多信息,我只在以下代码片段中键入了关系。 表

DASHBOARD {
  ID INTEGER PRIMARY KEY,
  NAME VARCHAR2(100) ...
}
FOLDER {
  ID INTEGER PRIMARY KEY,
  DASHBOARD_ID INTEGER,
  NAME VARCHAR2(100),
  PARENT_FOLDER_ID INTEGER .....
}

public class DashBoard{
    ....
    ....

@OneToMany(mappedBy = "dashboard", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@OrderBy("NAME ASC")
@Sort(type = SortType.NATURAL)
public SortedSet<Folder> getFolders() {
    return folders;
}    

}

public class Folder{
....
....
    @ManyToOne(fetch = FetchType.EAGER, optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "DASHBOARD_ID", nullable = false)
public DashBoard getDashBoard() {
    return dashboard;
}

@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@OrderBy("NAME ASC")
@Sort(type = SortType.NATURAL)
public SortedSet<Folder> getChildFolders() {
    return folders;
}             

@ManyToOne(fetch = FetchType.EAGER, optional = true, cascade = CascadeType.ALL)
@JoinColumn(name = "PARENT_FOLDER_ID")
public Criterion getParent() {
    return parent;
}
}

1 个答案:

答案 0 :(得分:0)

我放弃了DashBoard的关系 - &gt;文件夹,并由DAO层手动维护。这解决了hibernate cartisian join问题。我仍然认为可能有更好的解决方案,请告诉我。

谢谢,