我一直在尝试遵循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,但是如何从方面获得该信息?
答案 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());
}
}