通过主键/外键进行搜索时启用休眠过滤器 [英] Enable Hibernate filter when search by primary/foreign keys
问题描述
我使用spring数据并休眠@ Filter/@ FilterDef来过滤软删除的实体.似乎springRepository.findOne(id)总是返回值,即使id被软删除.此方法以及通过外键搜索其他字段的where子句中不包含过滤器.在这种情况下是否可以启用过滤器,使其可以用作@Where注释?
I use spring data and hibernate @Filter/@FilterDef to filter soft-deleted entities. It seems like springRepository.findOne(id) always returns value even if id was soft-deleted. Filter is not included in where clause for this method and for searching by another fields which is foreign keys. Is it possible to enable filter in this case so it will work as @Where annotation?
推荐答案
我遇到了同样的问题.我已经通过实现HibernatePersistenceProvider和HibernateEntityManagerFactory类解决了它.
I had the same problem. I've solved it by implementing HibernatePersistenceProvider and HibernateEntityManagerFactory classes.
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添加到您的配置类中:
After every session initialization the filter will be enabled. Now you jast need to add FilterEnableHibernatePersistenceProvider to your configuration class:
@Configuration
public class JpaConfiguration {
@Bean()
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean emFactory = new LocalContainerEntityManagerFactoryBean();
emFactory.setPersistenceProviderClass(FilterEnableHibernatePersistenceProvider.class);
//yours configuration
}
这篇关于通过主键/外键进行搜索时启用休眠过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!