我有Spring + JPA(Hibernate)项目,我连接到 MsSQL 数据库,现在我需要打开一个新连接,但这次它将是 MySQL 。 我正在使用XML配置
<bean id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${spring.datasource.driverClassName}" />
....
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource" p:packagesToScan="com.wsg.admin.api.model"
p:jpaVendorAdapter-ref="hibernateJpaVendorAdapter">
<property name="jpaProperties">
<props>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
....
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- Configure the MySQL connection -->
<bean id="enduserDataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${enduser.db.driver}" />
....
</bean>
<bean id="enduserEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="enduserDataSource" p:packagesToScan="com.wsg.admin.api.model"
p:jpaVendorAdapter-ref="hibernateJpaVendorAdapter">
<property name="jpaProperties">
<props>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
....
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="enduserTransactionManager" />
<bean id="enduserTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="enduserEntityManagerFactory" />
</bean>
然后我尝试使用片段
注入entityManager@Autowired
EntityManager entityManager;
但我得到例外
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'brandServiceImpl': Unsatisfied dependency expressed through field 'entityManager'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManager' available: expected single matching bean but found 2: org.springframework.orm.jpa.SharedEntityManagerCreator#0,org.springframework.orm.jpa.SharedEntityManagerCreator#1
答案 0 :(得分:1)
由于您有两个实体管理器(来自EntityMangaerFactory),您需要告诉spring您要成为Autowired的特定实体管理器。使用@Qualifier
@Autowired
@Qualifier("enduserEntityManagerFactory") // use bean id of the Entity Manager Factory you want to inject
EntityManagerFactory entityManagerFactory
EntityManager entityManager = entityManagerFactory.createEntityManager();
有关此here
的更多信息答案 1 :(得分:0)
固定。感谢@Volceri 我使用了答案https://stackoverflow.com/a/18073628/1973933,如下所示
为<property name="persistenceUnitName" value="appPU" />
entityManagerFactory
<bean id="entityManagerFactory" ... >
<property name="jpaProperties">
<props>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
...
</props>
</property>
<property name="persistenceUnitName" value="dataSourcePU" />
</bean>
<bean id="endUserEntityManagerFactory" ... >
<property name="jpaProperties">
<props>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
...
</props>
</property>
<property name="persistenceUnitName" value="enduserDataSourcePU" />
</bean>
并注入em对象,我使用
@PersistenceContext(unitName="dataSourcePU")
EntityManager entityManager;
@PersistenceContext(unitName="enduserDataSourcePU")
EntityManager endUserEntityManager;