2009-12-09 26 views
6

estoy tratando de añadir una base de datos de más/esquema/persistenceUnit en mi proyecto y estoy recibiendo el error:APP múltiple unidad de persistencia de errores

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

I Google/API adjudicar y no podía encontrado por qué la primavera se está quejando de mi configuración.

Aquí es parte de mi 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"/> 


Algunas preguntas:

  • ¿Es necesario tener dos TX: anotación impulsada?
  • ¿Debo especificar persistenceUnitName en la fábrica?

Estoy poniendo algunas notas de mi digg, en el foro de primavera (LINK)

Bueno eso es todo ... cualquier ayuda será contenta!

+0

el gestor de definición primera entidad no era visible, y era complicado;) (arreglado) – Bozho

+0

dar a sus usos @PersistenceContext – Bozho

Respuesta

2

Esta excepción significa que está intentando autocausar EntityManagerFactory por tipo. ¿Tiene alguna anotación @Autowired en su código?

Aslo, al usar @PersistenceContext, establezca el atributo unit correctamente. Y (no estoy seguro de si esto es lo que se debe hacer): intente configurar el atributo name con su nombre de fábrica respectivo.

Además, verifique si usted no ha copiar-pegar de forma incorrecta el administrador de transacciones RESTO - ahora no hay tal frijol REST

+0

Sin anotaciones @Autowired en mi fuente, siempre uso:
@PersistenceContext EntityManager em privado; –

+0

No entiendo su punto sobre: ​​transactionManagerREST –

+0

- no parece derecho – Bozho

0

Asegurar la totalidad de su @PersistenceContext especifique unitName. No he descubierto cómo decirle a Spring que un EMF o PersistenceUnit en particular es el predeterminado. Pensé que especificar primary = "true" en el EMF predeterminado funcionaría pero no aparece en

0

¿Debo especificar el nombre de persistencia en la fábrica?

Si tiene varias unidades de persistencia, necesita especificar cuáles usarán las fábricas.

Más al corazón de la cuestión, vea SPR-3955. En resumen, las versiones anteriores a Spring 3.0M4 no admiten múltiples gestores de transacciones con @Transactional. Tampoco creo que respete el atributo "unitName" para @PersistenceContext, por lo que tampoco puede especificarlo.

Para un ejemplo de cómo trabajé en torno a este mediante la inyección de forma explícita EntityManagerFactory s y el uso de AOP para volver a habilitar @Transactional, ver my sample app

3

Con la primavera, es necesario tener una sola EntityManagerFactory. Lo que está buscando se describe en la documentación de Spring en el capítulo 13.5.1.4: "Se ocupa de múltiples unidades persitence"

Puedo copiar/pega el siguiente texto:

"13.5.1.4 Tratar con múltiples unidades de persistencia

Para las aplicaciones que se basan en múltiples ubicaciones unidades de persistencia, almacenada en diversos JARS en el classpath, por ejemplo, Spring ofrece PersistenceUnitManager para que actúe como un repositorio central y para evitar el proceso de descubrimiento de unidades de persistencia, que puede ser costoso. La implementación predeterminada permite especificar múltiples ubicaciones que se analizan y luego se recuperan mediante la persistencia nombre de la unidad. (De forma predeterminada, la ruta de clase se busca para los archivos 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> 

La implementación predeterminada permite la personalización de los casos PersistenceUnitInfo, antes de que se alimentan al proveedor JPA, declarativa través de sus propiedades, que afectan a todas las unidades alojados, o mediante programación, a través de la PersistenceUnitPostProcessor, que permite la selección unidad de persistencia. . Si no se especifica ningún PersistenceUnitManager, uno se crea y se utiliza internamente por LocalContainerEntityManagerFactoryBean"

Cuestiones relacionadas