[Java] [Spring] Eine Aufzeichnung erfolgloser Versuche, Hibernate-Filter beim Instanziieren eines Spring Data Repository zu aktivieren

Motivation

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.

Aufzeichnung des Fehlers

Verwenden Sie Ihre eigene Repository-Factory

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)

Repository-Factory erstellt

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();
        }

    }
}

Details des Fehlers

Zum Zeitpunkt der Instanziierung des Repositorys gibt es keine Sitzung, da die Transaktion nicht gestartet wurde.

Es ist natürlich, nicht wahr?

Recommended Posts

[Java] [Spring] Eine Aufzeichnung erfolgloser Versuche, Hibernate-Filter beim Instanziieren eines Spring Data Repository zu aktivieren
Verwenden Sie jenv, um mehrere Java-Versionen zu aktivieren
Dinge, die Sie beim Schreiben von Java beachten sollten
[Java] Dinge, die Sie bei der Ausgabe von FizzBuzz beachten sollten
Dinge, die Sie beim Schreiben von Code in Java beachten sollten