【问题标题】: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
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2011-02-17
      • 2015-12-14
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多