Hibernate实体过滤Spring数据存储库

时间:2015-08-25 13:42:20

标签: java spring hibernate jpa spring-data

我正在尝试将Hibernate 4's Entity level @Filter's与Spring Boot项目中的Spring数据存储库一起使用。我的最终目标是使用比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(){

    }

从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{

并在我的建议中启用它

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

并且未应用过滤器。

0 个答案:

没有答案