2013-07-24 53 views
13

我是春天的春天3.2。下面是我的配置文件獲取錯誤沒有定義[javax.persistence.EntityManagerFactory]類型的合格bean:預計單個匹配bean,但找到2

<bean id="legacyDataSource" name="legacydb" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="true"> 
    <property name="driverClassName" value="${jdbc.legacy.driverClassName}" /> 
    <property name="url" value="${jdbc.legacy.url}" /> 
    <property name="username" value="${jdbc.legacy.username}" /> 
    <property name="password" value="${jdbc.legacy.password}" /> 
</bean> 

<bean id="ls360DataSource" name="Ls360db" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="true" > 
    <property name="driverClassName" value="${jdbc.ls360.driverClassName}" /> 
    <property name="url" value="${jdbc.ls360.url}" /> 
    <property name="username" value="${jdbc.ls360.username}" /> 
    <property name="password" value="${jdbc.ls360.password}" /> 
</bean> 

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

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

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

<bean id="legacyEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="dataSource" ref="legacyDataSource" /> 
    <property name="jpaVendorAdapter" ref="vendorAdaptor" />   
    <property name="packagesToScan" value="com.softech.ls360.integration.regulators.plcb.domain"/> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> 
      <prop key="hibernate.max_fetch_depth">3</prop> 
      <prop key="hibernate.jdbc.fetch_size">50</prop> 
      <prop key="hibernate.jdbc.batch_size">10</prop> 
      <prop key="hibernate.show_sql">true</prop>    
     </props>   
    </property> 
</bean> 

<bean id="ls360Emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="dataSource" ref="ls360DataSource" /> 
    <property name="jpaVendorAdapter" ref="vendorAdaptor" />   
    <property name="packagesToScan" value="com.softech.ls360.integration.regulators.plcb.domain"/> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> 
      <prop key="hibernate.max_fetch_depth">3</prop> 
      <prop key="hibernate.jdbc.fetch_size">50</prop> 
      <prop key="hibernate.jdbc.batch_size">10</prop> 
      <prop key="hibernate.show_sql">true</prop>    
     </props>   
    </property> 
</bean> 
<context:component-scan base-package="....db" /> 

這裏是我的類

@Service("dbManager") 
@Repository 
@Transactional 
public class DatabaseManager { 

    @PersistenceContext 
    @Qualifier("legacyEmf") 
    private EntityManager legacyEm; 

    @PersistenceContext 
    @Qualifier("ls360Emf") 
    private EntityManager ls360Em; 

    @SuppressWarnings("unchecked") 
    @Transactional(readOnly=true) 
    public List<Object> getResultList(String query, Class mappingClass) throws Exception { 

     //Query emQuery = legacyEm.createNativeQuery(query, mappingClass); 

     //return emQuery.getResultList(); 
     return null; 

    } //end of findTraineeFromLegacy() 
} 

現在,當我朗姆酒代碼中,我得到以下錯誤

Error creating bean with name 'dbManager': Injection of persistence 
dependencies failed; nested exception is 
org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: 
expected single matching bean but found 2: legacyEmf,ls360Emf 

爲什麼我收到此錯誤。我如何解決它?

謝謝

+0

同樣的問題,持久性單元的名稱,但所提出的解決方案不進行單元測試工作。你有沒有嘗試春季junit測試? –

回答

16

今天我有同樣的問題。解決它執行以下操作:

首先,我已經添加了參數的unitName到@PersistenceContext這兩個實體管理器屬性:

@PersistenceContext(unitName="appPU") 
@Qualifier(value = "appEntityManagerFactory") 
private EntityManager appEntityManager; 

@PersistenceContext(unitName="managerPU") 
@Qualifier(value = "managerEntityManagerFactory") 
private EntityManager managerEntityManager; 

而在我的配置文件我已經添加了一個屬性persistenceUnitName來我的bean定義:

<bean id="appEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource1" /> 
    <property name="persistenceUnitName" value="appPU" /> 
    <property name="packagesToScan" value="br.com.app.domain" /> 
    ... 
</bean> 

<bean id="managerEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource2" /> 
    <property name="persistenceUnitName" value="managerPU" /> 
    <property name="packagesToScan" value="br.com.app.domain" /> 
    ... 
</bean> 
+1

這很奇怪,因爲我今天遇到了完全相同的問題,但@Qualifier不起作用=(. 我很確定我所有的配置都沒問題,可否請您發佈整個應用程序上下文? 謝謝 – Marcelo

+0

該解決方案不適用於junit測試('AbstractTransactionalJUnit4SpringContextTests'),任何想法爲什麼? –

+0

非常感謝!它對我有效。在unitName中使用'@PersistenceContex'就足以解決注入問題。沒有必要使用@因爲你是注入EntityManager而不是EntityManagerFactory –

4

另外我想再次添加有用的評論:您需要擴展您的web應用程序的'web.xml'文件中的部分。從現在開始你有2個實體管理器,你需要2個OpenEntityManagerInViewFilters。在< PARAM值>在<豆ID appEntityManagerFactory < /參數值> = 'appEntityManagerFactory'= 「appEntityManagerFactory」 事實名稱

<filter> 
    <filter-name>OpenEntityManagerInViewFilter1</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
    <init-param> 
     <param-name>entityManagerFactoryBeanName</param-name> 
     <param-value>appEntityManagerFactory</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>OpenEntityManagerInViewFilter1</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 


<filter> 
    <filter-name>OpenEntityManagerInViewFilter2</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
    <init-param> 
     <param-name>entityManagerFactoryBeanName</param-name> 
     <param-value>managerEntityManagerFactory</param-value> 
    </init-param> 
    </filter> 

<filter-mapping> 

<filter-name>OpenEntityManagerInViewFilter2</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

注重 'appEntityManagerFactory':看的例子。

1

我也遇到過這樣的問題並解決了它。

請按照以下步驟來解決這個錯誤

添加下面一行到這兩個模式的所有實體類。

@PersistenceContext(unitName="persistenceUnit") 
transient EntityManager entityManager; 

其中「persistenceUnit」是您在persistance.xml文件中定義這裏

相關問題