2010-11-28 49 views
2

假設有兩個實體EntityA和EntityB。 爲兩個實體定義了兩個表。實體B是實體A的子實體。 現在在使用hibernate註釋的java pojos中,我已經定義了兩個對應於表EntityA和EntityB的類,如下所示。Hibernate:是否對父實體進行過濾隱式過濾子實體?

@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() 
     { 
     } 

    } 

因爲我對EntityA有過濾器。隱含的是,EntityB將只加載對應於EntityA的過濾對象的對象,記住父子關係或者需要明確地將過濾器放在EntityB上?

如果對EntityA進行過濾以使對應於2010年的對象僅被加載的示例。我希望EntityB的加載對象只應該是僅對應於2010年的EntityA對象的子對象。

回答

1

如果EntityB從不查詢,但總是通過entityA.getEntityBList()加載您的過濾器將工作。但如果您直接查詢EntityB,結果將不會被過濾。將過濾器視爲限制條款,包含在由Hibernate啓動的所有SQL的WHERE部分中,以加載EntityA

+0

我只在entityA表中不包含entityB中的年份列。如果假設我希望EntityB被過濾,即使我直接查詢它。我該怎麼辦?你能否給我提供示例代碼。 – 2010-12-15 07:48:52

0

我有同樣的問題。原來,你需要定義EntityB的過濾器中,你明確地做出EntityA參考,例如

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

正如你可以看到我已經使用了XML我休眠的定義。我相信它也可以用註釋。