我正在尝试将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);
}
并且未应用过滤器。