通过主键/外键进行搜索时启用休眠过滤器 [英] Enable Hibernate filter when search by primary/foreign keys

查看:86
本文介绍了通过主键/外键进行搜索时启用休眠过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆