2015-09-26 62 views
1

我需要为DAO配置xml文件。所以在我的xml文件中,我声明了两个entityManager Factory,并且我想将其中的一个设置为默认持久性单元。我已宣布部分如下面我dao.xml在哪种情况下,我需要提供spring class name作为bean id值?

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"> 
    property name="defaultPersistenceUnitName" value="pumps-jpa"/> 
</bean> 

但是,它并没有不适合我,它没有采取默认的持久性单元。我得到的错误是这样

类型没有唯一的bean定义:预计一个bean,但发现2:

很多搜​​索后,我发现他们所提到的bean ID一个代码片段弹簧类的名称即org.springframework.context.annotation.internalPersistenceAnnotationProcessor,如下图所示

<bean id="org.springframework.context.annotation.internalPersistenceAnnotationProcessor" 
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"> 
    property name="defaultPersistenceUnitName" value="pumps-jpa"/> 
</bean> 

所以提这个bean ID之后,它正在采取默认PERSI单位名称。我想知道,为什么我需要提到spring class(org.springframework.context.annotation.internalPersistenceAnnotationProcessor)作为bean id?这是一种黑客还是什么?下面

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

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="file:${catalina.base}/conf/pumps-dbconfig.properties"/> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
</bean> 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass"> 
     <value>${jdbc.driver}</value> 
    </property> 
    <property name="jdbcUrl"> 
     <value>${jdbc.url}</value> 
    </property> 
    <property name="user"> 
     <value>${jdbc.user}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password}</value> 
    </property> 
    <property name="initialPoolSize"><value>10</value></property> 
    <property name="minPoolSize"><value>10</value></property> 
    <property name="maxPoolSize"><value>${jdbc.maxConnections}</value></property> 
    <property name="maxIdleTimeExcessConnections"><value>600</value></property> 
    <!-- <property name="timeout"><value>0</value></property> --> <!-- 0 means: no timeout --> 
    <property name="idleConnectionTestPeriod"><value>60</value></property> 
    <property name="acquireIncrement"><value>5</value></property> 
    <property name="maxStatements"><value>0</value></property> <!-- 0 means: statement caching is turned off. --> 
    <property name="numHelperThreads"><value>3</value></property> <!-- 3 is default -->   
    <property name="unreturnedConnectionTimeout"><value>0</value></property> 
    <property name="debugUnreturnedConnectionStackTraces"><value>true</value></property> 
    <property name="testConnectionOnCheckout"><value>true</value></property> 
</bean> 

<!-- 
    Configuration for Hibernate/JPA 
--> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="pumps-jpa" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="generateDdl" value="false" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> 
     </bean> 
    </property> 
</bean> 

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

<!-- DEFAULT PERSISTENCE UNIT DECLARATION --> 

<bean id="org.springframework.context.annotation.internalPersistenceAnnotationProcessor" 
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"> 
    <property name="defaultPersistenceUnitName" value="pumps-jpa"/> 
</bean> 

<bean id="r-dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass"> 
     <value>${r-jdbc.driver}</value> 
    </property> 
    <property name="jdbcUrl"> 
     <value>${r-jdbc.url}</value> 
    </property> 
    <property name="user"> 
     <value>${r-jdbc.user}</value> 
    </property> 
    <property name="password"> 
     <value>${r-jdbc.password}</value> 
    </property> 
    <property name="initialPoolSize"><value>10</value></property> 
    <property name="minPoolSize"><value>10</value></property> 
    <property name="maxPoolSize"><value>${r-jdbc.maxConnections}</value></property> 
    <!-- <property name="timeout"><value>0</value></property> --> <!-- 0 means: no timeout --> 
    <property name="maxIdleTimeExcessConnections"><value>600</value></property> 
    <property name="idleConnectionTestPeriod"><value>60</value></property> 
    <property name="acquireIncrement"><value>5</value></property> 
    <property name="maxStatements"><value>0</value></property> <!-- 0 means: statement caching is turned off. --> 
    <property name="numHelperThreads"><value>3</value></property> <!-- 3 is default -->  
    <property name="acquireRetryAttempts"><value>3</value></property>  
    <property name="testConnectionOnCheckout"><value>true</value></property> 
</bean> 

<!-- 
    Configuration for Hibernate/JPA 
--> 
<bean id="r-entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="pumps-jpa" /> 
    <property name="dataSource" ref="r-dataSource" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="generateDdl" value="false" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> 
     </bean> 
    </property> 
</bean> 

<bean id="BaseDataConnection" class="com.myntra.commons.dao.impl.BaseDataConnection"> 
     <property name="roEntityManagerFactory" ref="r-entityManagerFactory" /> 
</bean> 

+0

发布整个配置xml – user2953113

回答

0

全dao.xml声明,我认为你原来的问题是不是你的意思! 通过配置,您可以将您的实体管理器现有的持久性单元实现之一称为“默认持久性单元”!你可以在你的XML配置中做到这一点! JPA中的persistence.xml是你的持久性配置你的bean(配置)xml是指向一些定义的持久性单元的其他选项。请发布您的整个配置xml ...

对于其余的问题与豆编号: 您的容器中已经有一个Bean初始化为相同的名称。 Container正在使用Bean Id作为您的可识别代码片段的唯一ID!如果您使用其他名称,那么您的容器将初始化同一个类的另一个bean实例并为其指定另一个名称。不过,正如我上面指出的那样,这与您的问题无关! (即使你可以绕过现有的bean实现,并重新定义你的配置,如果你没有其他选择!)

+0

哪个bean在我的容器中有相同的名称?我没有完全理解你:( –

+0

你这样做:)这个Id是独一无二的。如果你想使用相同的名称/类来初始化一个新的bean,你需要给它一个新的ID ... –

相关问题