Hibernate实体过滤Spring数据存储库

fra*_*cis 9 java spring hibernate jpa spring-data

我试图使用休眠4的实体一级@Filter同春数据仓库一个春天启动项目内.我的最终目标是使用比Hibernate @Where注释更灵活的东西来实现通用软删除.

经过一番努力,我已经找到了一个可能天真的解决方案,可以用一个来处理 @Aspect

我设置了一个Spring托管方面,目的是拦截对共享的调用EntityManager并启用适当的过滤器.

我玩了几个不同的切入点,看起来execution(public * javax.persistence.EntityManager.find(..))是一个绑定这个建议的好地方.

@Aspect
@Component
public class HibernateFilterInterceptor {

    private final EntityManager entityManager;
    private final PlatformTransactionManager platformTransactionManager;

    @Autowired
    public HibernateFilterInterceptor(EntityManager entityManager, PlatformTransactionManager platformTransactionManager) {
        this.entityManager = entityManager;
        this.platformTransactionManager = platformTransactionManager;
    }

    @Before("execution(public * javax.persistence.EntityManager.find(..))")
    public void beforeFind(){

    }
Run Code Online (Sandbox Code Playgroud)

从Hibernate docs/examples看来,我应该能够使用类似的东西来启用过滤器 entityManager.unwrap(Session.class).enableFilter("filter").setParameter("foo", 1);

所以测试我在单个实体上定义了一个简单的过滤器.

@FilterDef(name = "status", parameters = @ParamDef(name = "status", type = "integer"))
@Filters(
    @Filter(name = "status", condition = ":status = status")
)
public class Entity{
Run Code Online (Sandbox Code Playgroud)

并在我的建议中启用它

@Before("execution(public * javax.persistence.EntityManager.find(..))")
public void beforeFind(){
 entityManager.unwrap(Session.class).enableFilter("status").setParameter("status", 1);
}
Run Code Online (Sandbox Code Playgroud)

并且不应用过滤器.