JPA Parent/Child с тем же классом, проблема с поиском

У меня есть одна проблема с получением отношения Родитель/Дочерний тип "Иерархия папок". В идеале, в простом Oracle SQL было бы легко использовать предложение CONNECT BY. Но с Hibernate по какой-то причине он заканчивается двойным "LEFT OUTER JOIN" Parent to Child и Child to Parent.

Проблема: когда 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;
}
}

person gpa    schedule 27.12.2011    source источник
comment
Вот сериализованный объект DashBoard... DashBoard [id=3450, name=AG01, publicInd=false, publicEditableInd=false, folders=[Folder [id=3200, name= f1], Folder [id=3201, name=f2 , childFolders=[Папка [id=3202, parent.id=3201, name=f3], Папка [id=3203, parent.id=3201, name=f4], Папка [id=3204, parent.id=3201, name=f5], Папка [id=3205, parent.id=3201, name=f6], Папка [id=3206, parent.id=3201, name=f7]]], Папка [id=3204, parent.id =3201, имя=f5], Папка [id=3205, parent.id=3201, имя=f6], Папка [id=3206, parent.id=3201, имя=f7]]]   -  person gpa    schedule 28.12.2011
comment
Обратите внимание, что к объекту Dashboard также прикреплены следующие папки: Папка [id=3204, parent.id=3201, name=f5], Папка [id=3205, parent.id=3201, name=f6], Папка [id =3206, parent.id=3201, имя=f7]]]   -  person gpa    schedule 28.12.2011


Ответы (1)


Я удалил отношение DashBoard -> Папка и поддерживал его вручную на уровне DAO. Это решает проблему спящего режима Cartisian. Я все еще думаю, что может быть лучшее решение, чем это, пожалуйста, дайте мне знать.

Спасибо,

person gpa    schedule 29.12.2011