2015-10-01 1 views
2

J'ai besoin d'utiliser un EntityManagerFactory séparé pour chaque session HTTP de Spring 4. Cela est dû à l'authentification par le mot de passe de connexion DB. Je fais session scope DataSource et EntityManagerFactory comme ceci:Session HTTP portée EntityManagerFactory au printemps

@Bean 
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES) 
public FactoryBean<EntityManagerFactory> entityManagerFactory() throws SQLException { 
    LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();   
    factoryBean.setDataSource(dataSource()); 
    factoryBean.setPersistenceProviderClass(HibernatePersistence.class); 
    factoryBean.setPersistenceUnitName("db"); 
    return factoryBean; 
} 

Alors j'essaie de l'injecter dans singleton:

@PersistenceContext 
private EntityManager entityManager; 

Mais j'obtiens une erreur:

NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: scopedTarget.entityManagerFactory,entityManagerFactory 

Que pourrait-on faire pour l'injecter correctement?

+1

Non, vous n'avez pas besoin d'un objet de portée de session. Utilisez un ['UserCredentialsDataSourceWrapper' (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/UserCredentialsDataSourceAdapter.html) et définissez les informations d'identification pour chaque requête. N'essayez pas de travailler avec une session ou un autre gestionnaire d'entité. Ou utilisez le support de la prise en charge de la multi-location pour Hibernate, qui prend également en charge cette fonctionnalité prête à l'emploi. –

+0

Oh! Sensationnel. Pourriez-vous l'écrire comme une réponse? Je vais ensuite l'accepter. – AlexZam

Répondre

1

Vous n'avez pas besoin (ou ne voulez pas) de session étendue EntityManagerFactory.

soit utiliser un DataSource qui prend en charge la mise en informations d'identification pour le thread d'exécution, comme le UserCredentialsDataSourceAdapter ou utiliser le multi tenancy support qui est construit en veille prolongée.