Ich habe versucht, mit Hibernate 3 mandantenfähig zu werden.
Jede Tabelle verfügt über eine SystemId-Spalte zur Unterscheidung zwischen Mandanten.
Ich habe der JPA-Entität einen Hibernate-Filter hinzugefügt, der die SystemId-Spalte zu den Suchkriterien hinzufügt.
Ich habe der Konfiguration die folgenden Anmerkungen hinzugefügt, um meine eigene Repository-Factory zu verwenden.
@EnableJpaRepositories(basePackages = "com.example.dataaccess.repositories",
repositoryFactoryBeanClass = PrimaryRepositoryFactoryBean.class)
PrimaryRepositoryFactoryBean.class
public class PrimaryRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {
@Autowired //Dieses Kind hat eine SystemId
private CurrentAppUserDetailsProvider currentAppUserDetailsProvider;
@Override //Gibt RepositoryFactory zurück
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new MyRepositoryFactory(entityManager, currentAppUserDetailsProvider);
}
private static class MyRepositoryFactory<E, I extends Serializable> extends JpaRepositoryFactory {
private final EntityManager entityManager;
private final CurrentAppUserDetailsProvider currentAppUserDetailsProvider;
public MyRepositoryFactory(EntityManager entityManager,
CurrentAppUserDetailsProvider currentAppUserDetailsProvider) {
super(entityManager);
this.entityManager = entityManager;
this.currentAppUserDetailsProvider = currentAppUserDetailsProvider;
}
@Override
protected Object getTargetRepository(RepositoryMetadata metadata) {
Object repository = super.getTargetRepository(metadata);
SessionFactory sessionFactory = entityManager.getEntityManagerFactory().unwrap(SessionFactory.class);
Session session = sessionFactory.getCurrentSession(); //Ausnahme aufgetreten! !!
session.enableFilter("SYSTEM_ID_FILTER")
.setParameter("systemId", getSystemId());
return repository;
}
private int getSystemId() {
return currentAppUserDetailsProvider
.getCurrentAppUserDetails()
.getSystemId();
}
}
}
Zum Zeitpunkt der Instanziierung des Repositorys gibt es keine Sitzung, da die Transaktion nicht gestartet wurde.
Es ist natürlich, nicht wahr?
Recommended Posts