Доступ к EntityManager в @Aspect для JpaRepository - PullRequest
0 голосов
/ 17 сентября 2018

Я пытался следовать совету 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, но как мне получить это в аспекте?

1 Ответ

0 голосов
/ 17 сентября 2018

попробуйте ввести 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...