2010-08-02 10 views
3

Je Javé la superclasse cartographié suivante qui fournit une implémentation de base pour une relation auto parent/enfant pour créer une liste parent/enfant pour l'imbrication illimité d'articles (c.-à-catégories)Hibernate parent/enfant SELECT N + 1 numéro

@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>(); 

Si je charge la table entière avec fetch join sur le parent et les enfants, une seule sélection charge tous les enregistrements et je peux heureusement traverser l'arbre. mon problème vient quand je spécifie pour récupérer un noeud sur l'arbre. Je veux le noeud et tous ses enfants dans un seul select. ci-dessous est le hql pour le chargement de la table entière:

hql.append(String.format("tree from %s tree ", tableName)); 
hql.append("left join fetch tree.parent ");  
hql.append("left join fetch tree.children "); 

si je spécifie le nom du noeud, à savoir:

where tree.name = :name 

puis hibernent récupère le nœud, mais quand je avoir accès aux enfants i obtenir le SELECT N +1 problème Je comprends pourquoi cela se produit, (à cause de l'arbre.nom =: nom) mais est-il possible d'écrire le HQL pour qu'il charge le nœud spécifié et tous ses enfants?

Je suis juste essayer de trouver un moyen de soutenir d'une simple liste de point imbriqué où je peux récupérer un nœud parent et ses enfants avec un seul sélectionner

merci à l'avance,

Répondre

1

Avez-vous essayé utilisant l'annotation @BatchSize?

@BatchSize(size = 20) 

Ex:

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

Ensuite, si vous spécifiez la jointure aux enfants dans votre HQL, vous devriez être en mesure d'éviter n + 1 select. Je ne suis pas sûr, en passant, s'il existe un moyen de spécifier la taille du lot dans l'instruction HQL.

+0

hey merci beaucoup, cela a vraiment amélioré la performance à un niveau acceptable .. pensé que je pourrais avoir à mettre en place un ensemble imbriqué, dont je n'ai pas le temps pour le moment .. merci encore –