使用SpringJPA和Hibernate访问会话以启用过滤器

使用SpringJPA和Hibernate访问会话以启用过滤器,spring,hibernate,spring-orm,Spring,Hibernate,Spring Orm,在SpringJPA+Hibernate环境中,我需要启用Hibernate实体过滤器。 所以我应该可以访问Hibernate会话对象,但我使用的是EntityManagerFactory和Spring JPA magics。 有任何会话拦截器,因此每次Spring创建新会话时,我都可以对其调用enableFilters()方法?我最终得到了AOP解决方案: @Aspect @Component public class EnableFilterAspect { @AfterRetur

在SpringJPA+Hibernate环境中,我需要启用Hibernate实体过滤器。 所以我应该可以访问Hibernate会话对象,但我使用的是EntityManagerFactory和Spring JPA magics。
有任何会话拦截器,因此每次Spring创建新会话时,我都可以对其调用enableFilters()方法?

我最终得到了AOP解决方案:

@Aspect
@Component
public class EnableFilterAspect {

    @AfterReturning(
            pointcut="bean(entityManagerFactory) && execution(* createEntityManager(..))",
            returning="retVal")
    public void getSessionAfter(JoinPoint joinPoint, Object retVal) {
        if (retVal != null && EntityManager.class.isInstance(retVal)) {
            Session session = ((EntityManager) retVal).unwrap(Session.class);
            session.enableFilter("myFilter").setParameter("myParameter", "myValue");
        }
    }

}

这里有一个我用于支持对象删除的应用程序-

    entityManager.unwrap(Session.class)
            .enableFilter("notDeleted")
            .setParameter("isDeleted", false);

真正统一的解决方案。唯一的遗憾是Spring数据设计太糟糕了,只有像这样的黑客才能工作。就像在春天的不同地方一样,私人决赛,没有一点你可以用自定义代码钩住。谢谢!我使用了entityManager,但如果没有事务,它就无法工作。这个答案对我帮助很大。