2010-11-28 63 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我休眠的定义。我相信它也可以用注释。