Java 按主键/外键搜索时启用休眠筛选器
我使用spring数据和hibernate@Filter/@FilterDef来过滤软删除的实体。看起来就像springRepository.findOne(id)总是返回值,即使id被软删除。此方法的where子句中不包括筛选器,也不包括通过外键的其他字段进行搜索的筛选器。在这种情况下是否可以启用过滤器,使其作为@Where注释工作?我也遇到了同样的问题。我通过实现HibernatePersistenceProvider和HibernateEntityManagerFactory类解决了这个问题Java 按主键/外键搜索时启用休眠筛选器,java,hibernate,filter,spring-data,Java,Hibernate,Filter,Spring Data,我使用spring数据和hibernate@Filter/@FilterDef来过滤软删除的实体。看起来就像springRepository.findOne(id)总是返回值,即使id被软删除。此方法的where子句中不包括筛选器,也不包括通过外键的其他字段进行搜索的筛选器。在这种情况下是否可以启用过滤器,使其作为@Where注释工作?我也遇到了同样的问题。我通过实现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
}
我也有同样的问题。我通过实现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
}