2015-03-02 28 views
12

Sorgular (değişiklik yapmayan) ve komutlar için bir tane (değişiklik) için bir veritabanı kullanmam gerekir. Bazen şöyle kullanmaya EntityManager ile karar vermeniz gerekir benim depo olarakSpring + JPA + çoklu kalıcılık birimleri: EntityManager'ı enjekte etme

@Configuration 
@EnableJpaRepositories(value = "com.company.read", 
     entityManagerFactoryRef = "readingEntityManagerFactory", 
     transactionManagerRef = "readingTransactionManager") 
@EnableTransactionManagement 
public class SpringDataJpaReadingConfiguration { 

    @Bean(name = "readingEntityManagerFactory") 
    public EntityManagerFactory readingEntityManagerFactory() { 
     return Persistence.createEntityManagerFactory("persistence.reading"); 
    } 

    @Bean(name = "readingExceptionTranslator") 
    public HibernateExceptionTranslator readingHibernateExceptionTranslator() { 
     return new HibernateExceptionTranslator(); 
    } 

    @Bean(name = "readingTransactionManager") 
    public JpaTransactionManager readingTransactionManager() { 
     return new JpaTransactionManager(); 
    } 

} 

@Configuration 
@EnableJpaRepositories(value = "com.company.write", 
     entityManagerFactoryRef = "writingEntityManagerFactory", 
     transactionManagerRef = "writingTransactionManager") 
@EnableTransactionManagement 
public class SpringDataJpaWritingConfiguration { 

    @Bean(name = "writingEntityManagerFactory") 
    public EntityManagerFactory writingEntityManagerFactory() { 
     return Persistence.createEntityManagerFactory("persistence.writing"); 
    } 

    @Bean(name = "writingExceptionTranslator") 
    public HibernateExceptionTranslator writingHibernateExceptionTranslator() { 
     return new HibernateExceptionTranslator(); 
    } 

    @Bean(name = "writingTransactionManager") 
    public JpaTransactionManager writingTransactionManager() { 
     return new JpaTransactionManager(); 
    } 

} 

:

@Repository 
public class UserReadingRepository { 

    @PersistenceContext(unitName = "persistence.reading") 
    private EntityManager em; 

    // some useful queries here 
} 

Ben kalıcılık biriminin adını kullanıyorum ben Bahar Veri JPA kullanıyorum, bu yüzden iki yapılandırma sınıfları benim persistence.xml tanımlanan:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 

    <persistence-unit name="persistence.reading" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <non-jta-data-source>ReadingDS</non-jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
      <property name="hibernate.show_sql" value="true" /> 
     </properties> 
    </persistence-unit> 

    <persistence-unit name="persistence.writing" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <non-jta-data-source>WritingDS</non-jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
      <property name="hibernate.show_sql" value="true" /> 
     </properties> 
    </persistence-unit> 

</persistence> 

Bahar org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'persistence.reading' tanımlanır atar. Garip bir şekilde, Bahar bir kalıcılık birimi adı ile bir fasulye örneğini başlatmak için çalışır gibi görünüyor? Bir şeyi yanlış yapılandırdım mı?

GÜNCELLEME: Ben @PersistenceContext ek açıklamadan unitName = "persistence.reading" kaldırdığınızda, bunun yerine hatayı aşağıdaki alırsınız: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: readingEntityManagerFactory,writingEntityManagerFactory

GÜNCELLEME 2: Rohit yerine EntityManagerFactory tel (yorumunda) önerdi. Böylece aşağıdaki yapmaya çalıştım:

@PersistenceUnit(unitName = "persistence.reading") 
private EntityManagerFactory emf; 

ama Bahar yalnızca raporları: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'persistence.reading' is defined

SON FIX: Vlad cevabı sayesinde, şu kullanmaya kodunu güncellemek başardı (sadece yapmak emin siz de) sizin dataSource fasulye tanımlayın:

@Bean(name = "readingEntityManagerFactory") 
public EntityManagerFactory readingEntityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setPersistenceUnitName("persistence.reading"); 
    em.setDataSource(dataSource()); 
    em.setPackagesToScan("com.company"); 
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
    em.afterPropertiesSet(); 
    return em.getObject(); 
} 
+0

Neden "transactionManagerFactory" özelliğini "transactionManager" ayarlamıyorsunuz? 'Persistence.xml' dosyanız nerede? –

+0

'persistence.xml',' META-INF' içindeki sınıfyolundadır. "TransactionManagerFactories" öğesini "transactionManager" çekirdeklerine ayarlamaya çalıştım, ancak sonuçlar tam olarak aynı. – Xorty

+0

FYI 'persistence.xml' ifadesinin göründüğünden eminim, eğer sadece bir entityManager kullanarak geri dönersem o zaman Spring tüm çekirdekleri başarılı bir şekilde toplar. – Xorty

cevap

6

EntityManageFactoryproperly configured değildir. Bunun yerine LocalContainerEntityManagerFactoryBean kullanmalısınız:

@Bean(name = "readingEntityManagerFactory") 
public EntityManagerFactory readingEntityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setPersistenceUnitName("persistence.reading"); 
    em.setDataSource(dataSource()); 
    em.setPackagesToScan("com.company"); 
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
    em.afterPropertiesSet(); 
    return em.getObject(); 
} 

Ayrıca JpaTransactionManager bayan yapılandırılmış too. Sen okuma ve yazma EntityManager yapılandırmaları için aynı yapmanız gereken

@Bean(name = "readingTransactionManager") 
public PlatformTransactionManager readingTransactionManager(){ 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(readingEntityManagerFactory()); 
    return transactionManager; 
} 

: bir şey gibi olmalıdır.

+0

Teşekkürler Vlad, sonunda çalışmayı başarabiliyordum. Lütfen asıl sorudaki güncellemeye bakın ve diğer insanların da bu sorunla karşılaşması durumunda cevabınızı da (en azından derler) :) düzeltin. – Xorty

+0

Nokta alındı. Bu cevabı bir tabletten yazdım ve düzenleme yaparken derleyicinin işini kafamda çalıyordum. Herhangi bir soru-cevap karışıklığını önlemek için cevabınızı Final Fix'ınızla güncelledim. –

İlgili konular