2012-05-28 48 views
2

我想過濾只顯示「活動」實體,同時進行查詢,使用過濾器和基地MappedSuperClass和運行到相關的表類不尊重相同的過濾器的問題。與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上有過濾器。沒有任何方法可以做到我正在尋找的東西,而無需在每個關聯上應用單獨的過濾器?

謝謝!

回答

2

我找不到在年底這個偉大的解決方案,而海關大樓的東西,所以我結束了在每個模型在每個關聯表註釋@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"); 

曾經在一個共同的數據訪問層。