[Java] [Spring] Enregistrement de l'échec de l'activation du filtre Hibernate lors de l'instanciation du référentiel de données Spring

Motivation

J'ai essayé de multi-locataire avec Hibernate 3.

Chaque table a une colonne SystemId pour distinguer les locataires.

J'ai ajouté un filtre Hibernate à une entité JPA qui ajoute la colonne SystemId aux critères de recherche.

Enregistrement de l'échec

Utilisez votre propre usine de référentiels

J'ai ajouté les annotations suivantes à la configuration pour utiliser ma propre fabrique de référentiels.

@EnableJpaRepositories(basePackages = "com.example.dataaccess.repositories",
        repositoryFactoryBeanClass = PrimaryRepositoryFactoryBean.class)

Fabrique de référentiels créée

PrimaryRepositoryFactoryBean.class


public class PrimaryRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {

    @Autowired //Cet enfant a un SystemId
    private CurrentAppUserDetailsProvider currentAppUserDetailsProvider;

    @Override //Renvoie RepositoryFactory
    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(); //Il y a une exception! !!

            session.enableFilter("SYSTEM_ID_FILTER")
                    .setParameter("systemId", getSystemId());

            return repository;
        }

        private int getSystemId() {
            return currentAppUserDetailsProvider
                    .getCurrentAppUserDetails()
                    .getSystemId();
        }

    }
}

Détails de l'échec

Au moment de l'instanciation du référentiel, il n'y a pas de session car la transaction n'a pas démarré.

C'est naturel, non?

Recommended Posts

[Java] [Spring] Enregistrement de l'échec de l'activation du filtre Hibernate lors de l'instanciation du référentiel de données Spring
Utilisez jenv pour activer plusieurs versions de Java
Points à prendre en compte lors de l'écriture de Java
[Java] Éléments à prendre en compte lors de la sortie de FizzBuzz
Éléments à prendre en compte lors de l'écriture de code en Java