首页 文章

Spring Data JPA具有自定义RepositoryFactory和Multiple EntityManagers

提问于
浏览
1

我目前正在尝试使用Spring Data JPA来处理两个DataSource,从而使用两个EntityManagers . 我的存储库都继承自定义基类“BaseRepositoryImpl” .

Problem: 我总是得到以下异常:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No unique bean of type [javax.persistence.EntityManagerFactory] is defined: 
expected single bean but found 2: entityManagerFactory1,entityManagerFactory2

Question: 如何告诉我的自定义RepositoryFactory使用哪个EntityManagerFactory?

这是我的Spring配置:

<jpa:repositories base-package="package1" transaction-manager-ref="..."
  factory-class="MyFactoryBean"
  entity-manager-factory-ref="entityManagerFactory1"/>  

<bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="..." />
</bean>

<bean id="entityManagerFactory1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource" ref="dataSource1" />
  <property name="persistenceUnitName" value="unit1" />   
  ...
</bean>

<jpa:repositories base-package="package2" transaction-manager-ref="..."
  factory-class="MyFactoryBean"
  entity-manager-factory-ref="entityManagerFactory2"/>  

<bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="..." />
</bean>

<bean id="entityManagerFactory2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource" ref="dataSource2" />
  <property name="persistenceUnitName" value="unit2" />   
  ...
</bean>

类"MyFactoryBean"的实现与http://docs.spring.io/spring-data/jpa/docs/1.4.x/reference/htmlsingle/#repositories.custom-behaviour-for-all-repositories中描述的完全相同 .

Spring似乎忽略了配置“entity-manager-factory-ref”,至少在使用自定义RepositoryFactory时 .

任何提示?

1 回答

  • 1

    实体管理器工厂用于为不同的持久性单元创建实体管理器 . 您声明实体管理器bean,然后将实体管理器工厂bean作为其类 .

    这对我有用:

    <tx:annotation-driven transaction-manager="transactionManager" />
    
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
    
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="defaultEntityManager"/>
    </bean>
    
    <bean id="defaultDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${hibernate.connection.driver_class}"/>
        <property name="url" value="${db.default.url}"/>
        <property name="username" value="${db.default.username}"/>
        <property name="password" value="${db.default.password}"/>
    </bean>
    
    <bean id="defaultEntityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="defaultDataSource"/>
        <property name="persistenceUnitName" value="defaultPersistenceUnit"/>
    </bean>
    
    <bean id="otherDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${hibernate.connection.driver_class}"/>
        <property name="url" value="${db.other.url}"/>
        <property name="username" value="${db.other.username}"/>
        <property name="password" value="${db.other.password}"/>
    </bean>
    
    <bean id="otherEntityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="otherDataSource"/>
        <property name="persistenceUnitName" value="otherPersistenceUnit"></property>
    </bean>
    

    然后,当您实现数据访问类时,只需声明:

    @Repository
    @Transactional
    public class MyDAOImpl implements MyDAO
    {
        @PersistenceContext(unitName = "defaultPersistenceUnit")
        private EntityManager entityManager;
    }
    

    对于使用其他持久性单元的DAO:

    @Repository
    @Transactional
    public class MyOtherDAOImpl implements MyOtherDAO
    {
        @PersistenceContext(unitName = "otherPersistenceUnit")
        private EntityManager entityManager;
    }
    

相关问题