HTTP会话在Spring中确定了EntityManagerFactory的范围

时间:2015-10-01 13:39:35

标签: java spring hibernate spring-mvc hibernate-entitymanager

我需要在Spring 4中为每个HTTP会话使用单独的EntityManagerFactory。这是因为通过DB登录密码进行身份验证。 所以我像这样制作会话范围的DataSourceEntityManagerFactory

@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;
}

然后我尝试将其注入单身:

@PersistenceContext
private EntityManager entityManager;

但是我收到了一个错误:

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

可以做些什么来正确注射?

1 个答案:

答案 0 :(得分:1)

您不需要(或想要)一个范围EntityManagerFactory的会话。

使用支持为执行线程设置凭据的DataSource,例如UserCredentialsDataSourceAdapter或使用构建到hibernate中的multi tenancy support