在@Aspect中访问JpaRepository的EntityManager

时间:2018-09-17 13:40:12

标签: java spring spring-boot spring-data-jpa

我一直在尝试遵循1的建议,以在Spring Boot 2.0.5中使用Hibernate拦截器和过滤器实现基于区分符列的多租户。到目前为止,拦截器正在运行,但是我想将Hibernate过滤器直接应用于Spring Data JPA存储库。我写的方面看起来像这样:

matrix

然后我将@Aspect @Component public class TenantAwareRepositoryAspect { @Autowired private EntityManager entityManager; @Before("execution(* com.example.tenant.jpasupport.TenantAwareRepository+.*(..))") public void before(JoinPoint joinPoint){ entityManager .unwrap(Session.class) .enableFilter(TENANT_FILTER_NAME) .setParameter(TENANT_ID_PROPERTY_NAME, TenantHolder.getTenantId()); } } 作为标记接口添加到包含Tenant范围内的实体的存储库中。

现在:使用@DataJpaTest批注对存储库进行的测试运行得很好,但是当我启动应用程序并尝试获取一些数据时,我得到的是TenantAwareRepository,消息为”“没有事务性EntityManager”可用”。。我的应用程序配置上有一个IllegalStateException

我猜我需要访问在生成的Spring Data Repository中使用的exact EntityManager,但是如何从方面获得该信息?

1 个答案:

答案 0 :(得分:1)

尝试注入 EntityManagerFactory 而不是 EntityManager

@Aspect
@Component
public class TenantAwareRepositoryAspect {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Before("execution(* com.example.tenant.jpasupport.TenantAwareRepository+.*(..))")
    public void before(JoinPoint joinPoint){
        EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory)
            .unwrap(Session.class)
            .enableFilter(TENANT_FILTER_NAME)
            .setParameter(TENANT_ID_PROPERTY_NAME, TenantHolder.getTenantId());
    }
}