Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按主键/外键搜索时启用休眠筛选器_Java_Hibernate_Filter_Spring Data - Fatal编程技术网

Java 按主键/外键搜索时启用休眠筛选器

Java 按主键/外键搜索时启用休眠筛选器,java,hibernate,filter,spring-data,Java,Hibernate,Filter,Spring Data,我使用spring数据和hibernate@Filter/@FilterDef来过滤软删除的实体。看起来就像springRepository.findOne(id)总是返回值,即使id被软删除。此方法的where子句中不包括筛选器,也不包括通过外键的其他字段进行搜索的筛选器。在这种情况下是否可以启用过滤器,使其作为@Where注释工作?我也遇到了同样的问题。我通过实现HibernatePersistenceProvider和HibernateEntityManagerFactory类解决了这个问

我使用spring数据和hibernate@Filter/@FilterDef来过滤软删除的实体。看起来就像springRepository.findOne(id)总是返回值,即使id被软删除。此方法的where子句中不包括筛选器,也不包括通过外键的其他字段进行搜索的筛选器。在这种情况下是否可以启用过滤器,使其作为@Where注释工作?

我也遇到了同样的问题。我通过实现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
}

我也有同样的问题。我通过实现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
}