2009-12-09 9 views
6

sto cercando di aggiungere un altro database/schema/persistenceUnit nel mio progetto e sto ricevendo l'errore:JPA Multiple Unit Persistenza bug

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

I google/api assegnare e non sono riuscito a trovare perché la primavera si lamenta della mia configurazione.

Ecco parte della mia 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"/> 


Alcune domande:

  • Ho bisogno di avere due tx: annotazione-driven?
  • Devo specificare persistenceUnitName in fabbrica?

sto mettendo alcune note del mio digg forum primavera (LINK)

Beh questo è tutto ... qualsiasi aiuto sarà lieto!

+0

tua definizione direttore prima entità non era visibile, ed è stato difficile;) (risolto) – Bozho

+0

Lascia la tua @PersistenceContext usi – Bozho

risposta

2

Questa eccezione indica che si sta tentando di registrare automaticamente EntityManagerFactory per tipo. Hai qualche annotazione @Autowired nel tuo codice?

Analogamente, quando si utilizza @PersistenceContext, impostare correttamente l'attributo unit. E (non sono sicuro che sia una cosa corretta da fare): prova a impostare l'attributo name al nome del rispettivo factory.

Inoltre, controllare se non avete copia-incollato in modo errato il REST gestore delle transazioni - ora non esiste alcun chicco REST

+0

Non ci sono annotazioni @Autowired nella mia fonte, io uso sempre:
@PersistenceContext private EntityManager em; –

+0

Non ho il vostro punto su: transactionManagerREST –

+0

il - non sembra right – Bozho

0

Verificare tutti i tuoi @PersistenceContext specificare unitName. Non ho capito come dire a Spring che un determinato EMF o PersistenceUnit è l'impostazione predefinita. Ho pensato di specificare primary = "true" sul default EMF funzionerebbe ma non appare a

0

Devo specificare persistenceUnitName in fabbrica?

Se si dispone di più unità di persistenza, è necessario specificare quali verranno utilizzate dalle fabbriche.

Per saperne di più, vedere SPR-3955. Per riassumere, le versioni precedenti a Spring 3.0M4 non supportano più gestori di transazioni con @Transactional. Né credo che onori l'attributo "unitName" per @PersistenceContext, quindi non è possibile specificarlo.

Per un esempio di come ho lavorato intorno a questo iniettando esplicitamente EntityManagerFactory s ed utilizzando AOP per riattivare @Transactional, vedi my sample app

3

Con molla, è necessario disporre di un solo EntityManagerFactory. Quello che stai cercando è descritto nella documentazione di primavera al cap. 13.5.1.4: "Si occupa di più unità persitence"

I copiare/incollare il testo:

"13.5.1.4 Trattare con più unità di persistenza

Per le applicazioni che si basano su più sedi unità di persistenza, memorizzati in vari I JARS nel classpath, ad esempio, Spring offre PersistenceUnitManager per agire come un repository centrale e per evitare il processo di individuazione delle unità di persistenza, che può essere costoso.L'implementazione predefinita consente di specificare più percorsi che vengono analizzati e successivamente recuperati tramite la persistenza nome dell'unità (per impostazione predefinita, il classpath viene cercato per i file 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> 

L'implementazione predefinita consente la personalizzazione delle istanze PersistenceUnitInfo, prima di essere alimentati al provider JPA, dichiarativo attraverso le sue proprietà, che interessano tutte le unità ospitati, o automaticamente, attraverso il PersistenceUnitPostProcessor, che permette la selezione dell'unità di persistenza. . Se non viene specificato PersistenceUnitManager, si è creato e utilizzato internamente da LocalContainerEntityManagerFactoryBean"

Problemi correlati