Я верю, что Hibernate 5 делает
Я создаю приложение Multitenant SaaS и выбрал единую базу данных с общей схемой в качестве подхода Multitenancy. Каждая таблица имеет столбец дискриминатора «tenantId», чтобы изолировать данные клиента. Я использую Spring Boot в качестве основы приложения и использую JPA-данные для уровня данных с Hibernate в качестве поставщика JPA. Мне очень нравится, как данные Spring помогают устранить шаблонный код, и в настоящее время я закодировал репозитории, как показано ниже:
@Repository
public interface UserRepository extends JpaRepository<User,Long>{
}
и услуги, как показано ниже,
public class UserService{
@Autowired
private UserRepository userRepo;
public User getUser(){
User user = userRepo.findOne(id);
}
}
Постановка задачи: Когда я хочу получить пользователя, я хочу получить пользователя для конкретной организации. Мне интересно, как мне добавить критерии арендатора, я не хочу писать пользовательские реализации репозитория, так как это представит шаблонный код.
Попытки решения:
i) Hibernate Interceptor - onPrepareStatememt: это бесполезно, так как sql является строкой, и я не хочу делать манипуляции со строками.
ii) Включение фильтров гибернации с помощью Spring AOP: аннотированная сущность с @Filter и попытка установить фильтр в сеансе. Это не работает, так как аспект никогда не вызывается.
@AfterReturning(pointcut = "execution(* org.hibernate.jpa.internal.EntityManagerImpl.OpenSession(..))", returning = "session")
public void forceFilter(JoinPoint joinPoint, Object session) {
Session hibernateSession = (Session) session;
session.enableFilter("tenantFilter")
}
Фильтры гибернации звучат как многообещающий подход, но я как бы ударил стену, пытаясь найти рабочее решение. Я хотел бы знать, существует ли альтернативный подход для включения фильтра гибернации в сеансе, который данные Spring внутренне используют для запроса данных.