JPA Родитель / Ребенок с тем же классом, проблема поиска - PullRequest
0 голосов
/ 28 декабря 2011

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

Проблема: Когда hibernate тянет Объект папки «Панель инструментов» извлекается в«Картезианский продукт» Это означает, что он действительно вытаскивает родительский / дочерний элемент, но затем он также присоединяет те же дочерние папки к 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 голосов
/ 30 декабря 2011

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

Спасибо,

...