假设有两个实体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对象的子对象。
答案 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定义。我确信它也可以用注释。