2009-12-09 102 views
6

我想補充一個數據庫/模式/ persistenceUnit在我的項目,我收到錯誤:JPA多持久化單元的錯誤

No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2

我谷歌/ API配發及無法找到爲什麼春天抱怨我的配置。

這裏是我的applicationContext.xml的一部分

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 

     <property name="dataSource" ref="dataSource" /> 
     <property name="persistenceUnitName" value="transactionManager" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="${show.hibernate.sql}" /> 
       <property name="generateDdl" value="false" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> 
      </bean> 
     </property> 
    </bean> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="${database.driver}" /> 
     <property name="url" ... 
     <property name="testOnBorrow" value="true" /> 
    </bean> 

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

<bean id="entityManagerFactoryREST" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSourceREST" /> 
    <property name="persistenceUnitName" value="REST" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="${show.hibernate.sql}" /> 
      <property name="generateDdl" value="false" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> 
     </bean> 
    </property> 
</bean> 

<bean id="dataSourceREST" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${database.driver}" /> 
    ... 
    <property name="testOnBorrow" value="true" /> 
</bean> 

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

<tx:annotation-driven transaction-manager="REST"/> 
<tx:annotation-driven transaction-manager="transactionManager"/> 


一些問題:

  • 我需要有兩個TX:註釋驅動
  • 我需要指定persistenceUnitName來在工廠

我把我的Digg的一些注意事項,春季論壇(LINK

那麼完蛋了...任何幫助會很高興!

+0

你的第一個實體管理器的定義是不可見的,這是非常複雜的,)(固定它) – Bozho 2009-12-09 20:21:47

+0

給你@PersistenceContext用法 – Bozho 2009-12-09 20:48:41

回答

2

這異常意味着你正在試圖通過類型自動裝配EntityManagerFactory。你的代碼中有沒有@Autowired註釋?

ASLO,使用@PersistenceContext時,正確設置unit屬性。和(我不知道這是做正確的事) - 嘗試name屬性設置爲你們各自的工廠名稱。

此外,檢查如果你沒有複製粘貼錯誤的REST事務管理器 - 現在有沒有這樣的豆REST

+0

沒有@Autowired註解在我的來源中,我總是使用:
@ PersistenceContext private EntityManager em; – 2009-12-09 20:38:10

+0

我不明白你的意思:transactionManagerREST – 2009-12-09 20:40:11

+0

- 似乎沒有right – Bozho 2009-12-09 20:42:00

0

確保您的所有@PersistenceContext的指定的unitName。我還沒有想出如何告訴Spring特定的EMF或PersistenceUnit是默認的。我以爲在默認EMF會工作,但不會出現

0

指定一個主=「真」我需要在工廠指定persistenceUnitName來?

如果你有多個持久化單元,你需要指定工廠將使用的。

更多到問題的心臟,看到SPR-3955。總而言之,Spring 3.0M4之前的版本不支持@Transactional的多個事務管理器。我也不相信這榮譽@PersistenceContext了「的unitName」屬性,所以你不能指定,要麼。

對於我是如何工作解決此通過明確注入EntityManagerFactory S和使用AOP重新啓用@Transactional示例,請參見my sample app

3

使用Spring,你需要有一個唯一的EntityManagerFactory。 你所尋找的是春天文檔中描述的柱頭13.5.1。4:「涉及多個persitence單位」

我複製/粘貼文本:

「13.5.1.4與多個持久化單元

處理對於那些依靠多個持久化單元位置的應用,存儲在不同的例如,Spring提供了PersistenceUnitManager作爲中央存儲庫,並避免持久性單元發現過程,這個過程可能很昂貴。默認實現允許指定多個位置,這些位置被解析,並在以後通過持久性檢索單位名稱(默認情況下,在類路徑中搜索META-INF/persistence.xml文件。)

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="persistenceXmlLocations"> 
    <list> 
    <value>org/springframework/orm/jpa/domain/persistence-multi.xml</value> 
    <value>classpath:/my/package/**/custom-persistence.xml</value> 
    <value>classpath*:META-INF/persistence.xml</value> 
    </list> 
    </property> 
    <property name="dataSources"> 
    <map> 
    <entry key="localDataSource" value-ref="local-db"/> 
    <entry key="remoteDataSource" value-ref="remote-db"/> 
    </map> 
    </property> 
    <!-- if no datasource is specified, use this one --> 
    <property name="defaultDataSource" ref="remoteDataSource"/> 
</bean> 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitManager" ref="pum"/> 
    <property name="persistenceUnitName" value="myCustomUnit"/> 
</bean> 

默認實現允許PersistenceUnitInfo實例的定製,它們被饋送到JPA提供商之前,聲明性地通過它的屬性,這會影響所有託管的單位,或以編程方式,通過PersistenceUnitPostProcessor,這允許持久性單元的選擇。如果沒有指定PersistenceUnitManager,一種是創建和LocalContainerEntityManagerFactoryBean內部使用」