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