首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在春季应用中注入2 (3 )个不同的entityManagerFactory (或entityManager)

在春季应用中注入2 (3 )个不同的entityManagerFactory (或entityManager)
EN

Stack Overflow用户
提问于 2017-11-21 14:24:59
回答 2查看 244关注 0票数 1

我有Spring + JPA (Hibernate)项目,在这个项目中,我连接到MsSQL数据库,现在我需要打开一个新的连接,但这一次它将用于MySQL。我正在使用XML配置。

代码语言:javascript
复制
<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

代码语言:javascript
复制
@Autowired
EntityManager entityManager;

但我有例外

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-22 10:38:18

已修复。感谢@Volceri,我使用了答案https://stackoverflow.com/a/18073628/1973933,如下所示

<property name="persistenceUnitName" value="appPU" />添加到每个entityManagerFactory

代码语言:javascript
复制
<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对象,我使用了

代码语言:javascript
复制
@PersistenceContext(unitName="dataSourcePU")
EntityManager entityManager;

@PersistenceContext(unitName="enduserDataSourcePU")
EntityManager endUserEntityManager;
票数 0
EN

Stack Overflow用户

发布于 2017-11-21 14:28:12

因为您有两个实体管理器(来自EntityMangaerFactory),所以需要告诉spring您想要自动处理哪个EntityManager。使用@Qualifier

代码语言:javascript
复制
@Autowired  
@Qualifier("enduserEntityManagerFactory")  // use bean id of the Entity Manager Factory you want to inject
EntityManagerFactory entityManagerFactory

EntityManager entityManager = entityManagerFactory.createEntityManager();

更多关于这个这里的信息

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47415463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档