【问题标题】:Enable Hibernate filter when search by primary/foreign keys按主键/外键搜索时启用休眠过滤器
【发布时间】:2016-01-10 13:10:51
【问题描述】:
我使用 spring data 和 hibernate @Filter/@FilterDef 来过滤软删除的实体。即使 id 被软删除, springRepository.findOne(id) 似乎总是返回值。此方法的 where 子句中不包含过滤器,也不用于通过另一个外键字段进行搜索。在这种情况下是否可以启用过滤器,以便将其用作 @Where 注释?
【问题讨论】:
标签:
java
hibernate
filter
spring-data
【解决方案1】:
我遇到了同样的问题。我通过实现 HibernatePersistenceProvider 和 HibernateEntityManagerFactory 类解决了这个问题。
public class FilterEnableHibernatePersistenceProvider extends HibernatePersistenceProvider {
@Override
public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
return wrapEntityManagerFactory(super.createEntityManagerFactory(persistenceUnitName, properties));
}
@Override
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties) {
return wrapEntityManagerFactory(super.createContainerEntityManagerFactory(info, properties));
}
private EntityManagerFactoryWrapper wrapEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
return entityManagerFactory == null
? null
: new EntityManagerFactoryWrapper(entityManagerFactory);
}
public static class EntityManagerFactoryWrapper implements HibernateEntityManagerFactory {
//This is where the filters are being activated
protected EntityManager initSession(EntityManager entityManager) {
Session session = ((HibernateEntityManager) entityManager).getSession();
if (session.getEnabledFilter(FILTER_NAME) == null) {
Filter activeFilter = session.enableFilter(FILTER_NAME);
activeFilter.setParameter("some_field", some_value);
}
return entityManager;
}
// wrapp other methods
}
在每次会话初始化后,过滤器将被启用。现在您只需将 FilterEnableHibernatePersistenceProvider 添加到您的配置类:
@Configuration
public class JpaConfiguration {
@Bean()
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean emFactory = new LocalContainerEntityManagerFactoryBean();
emFactory.setPersistenceProviderClass(FilterEnableHibernatePersistenceProvider.class);
//yours configuration
}