2010-11-28 44 views
2

Supposons qu'il existe deux entités EntityA et EntityB. Deux tables sont définies pour les deux entités. EntityB est une entité enfant de EntityA. Maintenant dans les pojos java utilisant l'annotation hibernate, j'ai défini deux classes correspondant aux tables EntityA et EntityB comme ci-dessous.Hibernate: le filtre sur l'entité parente filtre-t-il implicitement l'entité enfant?

@FilterDef(name = "myfilter", parameters = { @ParamDef(name = "year", type = "int") }, defaultCondition = ":year = year") 

    public class EntityA 

    { 

     @OneToMany(mappedBy="EntityA") 
     List<EntityB> getEntityBList() 
     { 
     } 

    } 


    public class EntityB 
    { 

     @ManyToOne 
     @joincolumn(name="entityA_id") 
     EntityA getEntityA() 
     { 
     } 

    } 

Depuis que j'ai le filtre sur EntityA. Est-il implicite que EntityB aura des objets chargés seulement qui correspondent aux objets filtrés de EntityA en gardant à l'esprit la relation parent-enfant ou ont besoin de mettre explicitement le filtre sur EntityB? Exemple si EntityA est filtré de sorte que les objets correspondant à l'année 2010 soient chargés uniquement. Je veux que l'objet chargé d'EntityB soit seulement ce qui sont des fils d'EntityA objets correspondant à l'année 2010 seulement.

Répondre

1

Si EntityB n'est jamais interrogé directement, mais est toujours chargé via entityA.getEntityBList() votre filtre fonctionnera. Mais si vous interrogez directement , les résultats ne seront pas filtrés. Pensez aux filtres comme des clauses de restriction incluses dans la partie WHERE de tous les SQL tirés par Hibernate pour charger EntityA.

+0

J'ai la colonne de l'année seulement dans la table entityA pas dans l'entitéB. Si je suppose que je veux filtrer EntityB même si je l'interroge directement. Que devrais-je faire? Pouvez-vous s'il vous plaît me fournir un exemple de code. –

+0

Aucun corps n'a répondu à ma question pendant tant de jours. Suis-je pas clair en faisant mes points en question? Que devrais-je améliorer ma question? –

+0

Merci d'avoir répondu à toutes mes questions en suspens. –

0

J'ai eu le même problème. Il est avéré que vous devez définir un filtre pour vous dans lequel l'Entité explicitement faire référence à l'Entité, par exemple

<filter 
    name="myFilter" 
    condition="((select a.myProperty from EntityA a where a.id = entityA_id) = :myPropertyParam)" 
/> 

Comme vous pouvez le voir, je l'ai XML utilisé pour mes définitions de mise en veille prolongée. Je suis sûr que c'est aussi possible avec des annotations.