2012-04-23 7 views
1

2種類の異なるEntityManagerFactoryインスタンスを同じDAOに注入しようとしています。 私はプロジェクト内に汎用DAOを持っており、それを "Project Base"と呼ぶことにします。プロジェクトAとプロジェクトBの2つの異なるプロジェクトがあります。永続ユニットはProject Baseで定義されています。spring + JPAを使用して同じDAOに異なるエンティティマネージャファクトリを挿入する方法

私の問題は、私は2つの異なるデータベース、プロジェクトB.によって、プロジェクトAで使用されている1及び別の

Iを持っているとして@PersistenceUnitを使用する代わりに、DAOへEntityManagerFactoryインスタンスを注入できるようにしたいということですジェネリックDAOでの基本的なCRUD操作を持っていますが、春は私に次の例外を与えるのみ:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" 
    default-autowire="autodetect"> 
    <context:component-scan base-package="com.entertainment" /> 


    <!-- Entity Manager --> 
    <bean id="abstractEntityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" abstract="true"> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
     <property name="dataSource" ref="ADataSource" /> 
    </bean> 


    <bean id="AEntityManagerFactory" parent="abstractEntityManagerFactory"> 
     <property name="persistenceUnitName" value="A" /> 
    </bean> 

    <bean id="BEntityManagerFactory" parent="abstractEntityManagerFactory"> 
     <property name="persistenceUnitName" value="B" /> 
    </bean> 


    <!-- Datasource --> 
    <bean id="ADataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> 
     <property name="url" 
      value="myUrl" /> 
     <property name="username" value="username" /> 
     <property name="password" value="password" /> 
    </bean> 

    <bean id="BDataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> 
     <property name="url" 
      value="myUrl" /> 
     <property name="username" value="username" /> 
     <property name="password" value="password" /> 
    </bean> 


    <!-- Transaction Manager --> 
    <bean id="ATransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 


    <bean id="BTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <!-- Vendor adapter --> 
    <bean id="jpaVendorAdapter" 
     class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="databasePlatform" value="org.hibernate.dialect.Oracle9iDialect" /> 
     <property name="showSql" value="true" /> 
     <property name="generateDdl" value="true" /> 
    </bean> 

    <!-- generic DAO --> 

    <bean id="genericDAO" 
     class="mypackage.GenericHibernateDAO" abstract="true"/> 


</beans> 

Error creating bean with name 'genericHibernateDAO': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2 

以下の私の設定を見つけてください。

このファイルは、プロジェクトベースである:私は本当にこれを理解するために努力してきた

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0"> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 
    <persistence-unit name="A" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect" /> 
      <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.connection.username" value="username" /> 
      <property name="hibernate.connection.password" value="password" /> 
      <property name="hibernate.connection.url" value="myurl" /> 
      <property name="hibernate.max_fetch_depth" value="3" /> 
      <property name="hibernate.archive.autodetection" value="class" /> 
     </properties> 
    </persistence-unit> 
    <persistence-unit name="B" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect" /> 
      <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.connection.username" value="username" /> 
      <property name="hibernate.connection.password" value="password" /> 
      <property name="hibernate.connection.url" value="myurl" /> 
      <property name="hibernate.max_fetch_depth" value="3" /> 
      <property name="hibernate.archive.autodetection" value="class" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

。私はどんな助けにも感謝しています。

ありがとうございます!

答えて

0

@PersistenceUnit.unitNameを使用してパーシスタンスユニットを設定しようとしましたか?

1
@PersistenceUnit(unitName="A") 
EntityManagerFactory entityMgrFactory; 

ORあなたは2を持っているとのunitNameがなけれ

@Autowired 
@Qualified("AEntityManagerFactory") 
private EntityManagerFactory AEntityManagerFactory; 

OR

@PersistenceContext(unitName="A") 
EntityManager em; 

(これはpersistenceUnit Aに関連するEMFactoryを注入します)は、常に一つだけEMFactoryことを期待して、春ドンどのパスを知っていますか?

関連する問題