Spring 中的 HTTP 会话范围 EntityManagerFactory

HTTP session scoped EntityManagerFactory in Spring

我需要为 Spring 中的每个 HTTP 会话使用单独的 EntityManagerFactory 4。这是因为通过 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

怎样才能正确注入?

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

要么使用支持为执行线程设置凭据的 DataSource,例如内置到休眠中的 UserCredentialsDataSourceAdapter or use the multi tenancy support