我相信,与 AspectJ 相比,这更像是与 Spring JPA(Hibernate)相关的问题。
Spring Boot v2.2.2.RELEASE、Spring v5.2.2.RELEASE、Hibernate v5.4.9.Final、Spring 数据存储库
我正在尝试在我现有的单租户应用程序中实现多租户。
- 租户由用户通过前端选择。租户 ID 存储在 HttpSession 中。
- Rest Controller 方法的建议,读取租户 ID 并将其保存在 ThreadLocal 变量中。
现在我必须使用租户 ID 启用休眠过滤器。为此,我的存储库(接口扩展 JpaRepository)方法的 AspectJ 建议有效,但会为来自服务的每个存储库方法调用执行。
这篇文章是关于以下(相同的)实现,其中启用 Hibernate 过滤器的建议在从 HttpSession 读取租户 id 的建议之前被触发。如何更正订单?读取租户 ID 的建议不会进行任何存储库调用。
@AfterReturning(pointcut = "execution(* javax.persistence.EntityManagerFactory+.createEntityManager(..))", returning = "entityManager")
参考:https://github.com/spring-projects/spring-framework/issues/25125(该线程还包含非 AOP 方式 - 后处理事务性 EntityManager 实例 - 仅在 Spring Boot 启动时触发)@AfterReturning(pointcut="bean(entityManagerFactory) && execution(* createEntityManager(..))", returning="retVal")
参考:使用 Spring JPA 和 Hibernate 访问 Session 以启用过滤器
我尝试设置应用程序属性 spring.jpa.open-in-view=false,但这没有帮助。