Я Jave следующий отображенный суперкласс, который обеспечивает базовую реализацию для отношений родитель/ребенок самостоятельно создать список родителя/ребенка для неограниченной вложенности элементов (т.е. Категории)Hibernate Parent/Child ВЫБРАТЬ N + 1 проблема
@MappedSuperclass
public abstract class ParentChildPathEntity<N extends ParentChild> implements MaterializedPath<N> {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "parent_id")
private N parent;
@Column(name = "name", unique = true)
private String name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<N> children = new HashSet<N>();
Если я загружаю всю таблицу с помощью соединения fetch у родителя и дочерних элементов, один выбор загружает все записи, и я могу счастливо пересечь дерево. моя проблема возникает, когда я указываю, чтобы получить узел на дереве. Я хочу, чтобы узел и все его дети были в одном элементе. Ниже приводится HQL для загрузки всей таблицы:
hql.append(String.format("tree from %s tree ", tableName));
hql.append("left join fetch tree.parent ");
hql.append("left join fetch tree.children ");
если я указать имя узла, то есть:
where tree.name = :name
затем зимуют извлекает узел, но когда я доступ детей я получаю ВЫБЕРИТЕ N +1 выпуск. Я понимаю, почему это происходит (из-за tree.name =: name), но есть ли способ написать HQL, чтобы он загружал указанный узел и все его дочерние элементы?
Я просто пытаюсь выяснить способ поддержать список с помощью простого вложенного элемента, где я могу получить любой родительский узел и его потомков с одного выбора
заранее спасибо,
эй, спасибо, что это действительно улучшило производительность до приемлемого уровня .. подумал, что мне, возможно, придется реализовать вложенный набор, на который у меня нет времени прямо сейчас. –