Spring 中的 HTTP 会话范围 EntityManagerFactory
HTTP session scoped EntityManagerFactory in Spring
我需要为 Spring 中的每个 HTTP 会话使用单独的 EntityManagerFactory
4。这是因为通过 DB 登录密码进行身份验证。
所以我像这样制作会话范围的 DataSource
和 EntityManagerFactory
:
@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。
我需要为 Spring 中的每个 HTTP 会话使用单独的 EntityManagerFactory
4。这是因为通过 DB 登录密码进行身份验证。
所以我像这样制作会话范围的 DataSource
和 EntityManagerFactory
:
@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。