2015-10-12 3 views
0

Я использую данные о пружинах и спящий режим @ Filter/@ FilterDef для фильтрации объектов с мягким удалением. Кажется, что springRepository.findOne (id) всегда возвращает значение, даже если идентификатор был удален софт. Фильтр не включен в предложение where для этого метода и для поиска по другим полям, которые являются внешними ключами. Можно ли включить фильтр в этом случае, чтобы он работал как @Where аннотация?Включить фильтр гибернации при поиске с помощью первичных/внешних ключей

ответ

3

У меня была та же проблема. Я решил это, выполнив классы 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 
}