使用MappedSuperClass在相关表上进行Hibernate过滤

时间:2012-05-28 18:23:23

标签: java spring hibernate filter annotations

我正在尝试过滤以仅在进行查询时显示“活动”实体,使用过滤器和基本MappedSuperClass并遇到相关表类不遵循相同过滤器的问题。

这是我的模型设置:

@FilterDef(name="baseStatus")
@Filter(name="baseStatus", condition= "Status = 'A'")
@MappedSuperclass
public abstract class BaseModel {

    @Column(name = "Status", insertable = false)
    private String status;

    // getters and setters...
}

我也有相关集合的模型,例如..

@Entity
@Table(name = "A")
public class A extends BaseModel {
    @OneToMany()
    private List<B> bs = new ArrayList<B>(0);
// other model properties
}

@Entity
@Table(name = "B")
public class B extends BaseModel {
// model properties
}

在查询之前,我运行:

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(A.class)
Filter filter = getCurrentSession().enableFilter("baseStatus");
List<A> as = criteria.list();

使用此设置我将正确的过滤器应用于我正在查询的主类,但子集合(“bs”)不会在连接上进行过滤,因此我只剩下活动的“A” “B”的子集合,其中一些“B”处于非活动状态。

理想情况下,我只想在BaseModel上安装过滤器。如果不对每个关联应用单独的过滤器,有没有办法做我正在寻找的东西?

谢谢!

1 个答案:

答案 0 :(得分:3)

我最终没有找到一个很好的解决方案而没有构建自定义的东西,所以我最终在每个模型的每个关联表中注释@Filter,如下所示

@FilterDef(name="baseStatus")
@Filter(name="baseStatus", condition= "Status = 'A'")
@MappedSuperclass
public abstract class BaseModel {

    @Column(name = "Status", insertable = false)
    private String status;

    // getters and setters...
}

@Entity
@Table(name = "A")
public class A extends BaseModel {
    @OneToMany()
    @Filter(name="baseStatus", condition= "Status = 'A'")
    private List<B> bs = new ArrayList<B>(0);
// other model properties
}

@Entity
@Table(name = "B")
public class B extends BaseModel {
// model properties
}

虽然不理想,但它仍有效,我仍然只需要打电话

Filter filter = getCurrentSession().enableFilter("baseStatus");

进入公共数据访问层。