【问题标题】:Define multiple entityManagerFactory bean using Spring Java @Configuration使用 Spring Java @Configuration 定义多个 entityManagerFactory bean
【发布时间】:2014-03-27 16:56:13
【问题描述】:

我在我的系统中使用多个数据库。我正在使用AtomikosDataSourceBean 在多个数据库之间启用 xa 分布式事务。

spring-configuration.xml 文件中,我可以为两个独立的EntityManagerFactory 创建bean,比如entityManagerFactory1 和entityManagerFactory2。但是当我使用 Spring Java @Configuration 执行此操作时,出现错误。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined

如果我将一个创建为 entityManagerFactory,另一个创建为 entityManagerFactory1,则会收到错误

Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.tom.boon.core.model.Person

对于在 entityManagerFactory1 下创建的实体。

有人可以帮我弄清楚如何在 Spring Java @Configuration 中定义两个独立的 entityManagerFactory。

【问题讨论】:

    标签: spring entitymanager spring-data-jpa jta spring-java-config


    【解决方案1】:

    您并没有真正提供有关您的配置的详细信息。假设它们应该是相当简单的,那么您定义了两个 bean:entityManagerFactory1 和 entityManagerFactory2

    第一次使用需要通过@Resource引用这些:

    @Resource(name =  "entityManagerFactory1")
    EntityManager entityManager
    

    在其他用法中:

    @Resource(name =  "entityManagerFactory2")
    EntityManager entityManager
    

    这应该有效,除非有其他问题。如果是这种情况,请提供有关您正在做什么的更多详细信息。希望这会有所帮助。

    【讨论】:

    • 我的问题不同。您的答案是我将如何从一个类中访问两个不同的 entityManager。但我想知道如何在一个配置类中定义多个实体管理器。
    【解决方案2】:

    在您的配置文件中,使用persistenceUnitName 属性,如下所示:

    <bean id="foo" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSourceFoo"/>
        <property name="persistenceUnitName" value="foo"/>
    </bean>
    
    <bean id="bar" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSourceBar"/>
        <property name="persistenceUnitName" value="bar"/>
    </bean>
    

    看看dataSources 对他们来说有何不同。您可以在dataSourceFoodataSourceBar 中定义不同的连接属性。然后简单地使用:

    @PersistenceContext(unitName = "foo")
    private EntityManager foo;
    
    @PersistenceContext(unitName = "bar")
    private EntityManager bar;
    

    EntityManagers foo 和 bar 应该连接到不同的数据库。

    别忘了,如果你想让 Spring 识别 @PersistenceContext 注解,你需要在配置文件中添加 &lt;context:annotation-config /&gt; 元素。

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2020-05-22
      • 2019-12-05
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2019-03-16
      • 2015-10-02
      相关资源
      最近更新 更多