Я пытался следовать совету 1 , чтобы реализовать многопользовательский режим на основе столбцов дискриминатора с использованием перехватчиков и фильтров Hibernate в Spring Boot 2.0.5. Пока перехватчик работает, однако я хочу применить фильтр Hibernate непосредственно к репозиториям Spring Data JPA. Аспект, который я написал, выглядит следующим образом:
@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());
}
}
Затем я добавляю TenantAwareRepository
в качестве интерфейса маркера к репозиториям, содержащим объекты в области Tenant.
Теперь: мои тесты репозиториев с использованием аннотации @DataJpaTest проходят очень хорошо, но когда я запускаю приложение и пытаюсь получить некоторые данные, я получаю IllegalStateException
с сообщением "Нет доступного транзакционного EntityManager" . У меня @EnableTransactionManagement
в конфигурации моего приложения.
Я предполагаю, что мне нужен доступ к действующему EntityManager, который используется в сгенерированном репозитории данных Spring, но как мне получить это в аспекте?