Hibernate:对父实体进行过滤是否会隐式过滤子实体?

时间:2010-11-28 15:33:39

标签: java hibernate filter annotations parent-child

假设有两个实体EntityA和EntityB。 为两个实体定义了两个表。 EntityB是EntityA的子实体。 现在在使用hibernate注释的java pojos中,我已经定义了两个对应于表EntityA和EntityB的类,如下所示。

    @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对象的子对象。

2 个答案:

答案 0 :(得分:1)

如果永远不会直接查询EntityB,但始终通过entityA.getEntityBList()加载,则您的过滤器将有效。但是,如果您直接查询EntityB,则不会过滤结果。将过滤器视为Hibernate加载WHERE时所有SQL的EntityA部分中包含的限制条款。

答案 1 :(得分:1)

我遇到了同样的问题。事实证明,您需要为EntityB定义一个过滤器,您可以在其中明确地引用EntityA,例如

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

正如您所看到的,我已经将xml用于我的hibernate定义。我确信它也可以用注释。