2010-08-02 2 views
3

Я 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, чтобы он загружал указанный узел и все его дочерние элементы?

Я просто пытаюсь выяснить способ поддержать список с помощью простого вложенного элемента, где я могу получить любой родительский узел и его потомков с одного выбора

заранее спасибо,

ответ

1

Вы пробовали используя аннотацию @BatchSize?

@BatchSize(size = 20) 

Ex:

@OneToMany(mappedBy = ..., fetch = FetchType.LAZY) 
@BatchSize(size = 20) 
public SortedSet<Item> getItems() { ... } 

Затем, если указать присоединиться к детям в вашем HQL, вы должны быть в состоянии избежать п + 1 выберите. Я не уверен, небрежно, если есть способ указать размер партии в выражении HQL.

+0

эй, спасибо, что это действительно улучшило производительность до приемлемого уровня .. подумал, что мне, возможно, придется реализовать вложенный набор, на который у меня нет времени прямо сейчас. –

Смежные вопросы