2016-07-20 62 views
-1

我試圖配置兩個JPA數據源,我也一樣this example,每一件事情是好的,但是否有可能保持自動完成自動配置,只是添加一個新的,而不必手動創建LocalContainerEntityManagerFactoryBean春季啓動二級數據源配置

@Primary 
    @Bean(name = "dataSource") 
    @ConfigurationProperties(prefix="spring.datasource") 
    public DataSource dataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

@Bean 
PlatformTransactionManager transactionManager() { 
    return new JpaTransactionManager(entityManagerFactory().getObject()); 
} 

@Bean 
LocalContainerEntityManagerFactoryBean entityManagerFactory() { 

    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
    jpaVendorAdapter.setGenerateDdl(false); 

    LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); 

    factoryBean.setDataSource(dataSource()); 
    factoryBean.setJpaVendorAdapter(jpaVendorAdapter); 

    factoryBean.setPackagesToScan("com.xxxxxxxx.common.domain","com.xxxxxxx.tekram.cdrserver.domain"); 

    return factoryBean; 
} 
+0

只要您標記一個'@ Primary',就應該可以工作。 –

+0

對於你的第二個,你將不得不手動配置它。 –

+0

當一個配置爲輔助時,spring-boot不會自動配置LocalContainerEntityManagerFactoryBean,我的問題是我可以強制它自動創建它 – Shahbour

回答

2

我真的不知道什麼是你的具體問題,或者您希望acomplish什麼,但我會使用自動配置功能,你展示如何,我用了兩個數據源和春天啓動:

(只是爲了更好地閱讀在單獨的類)創建爲每個數據源配置:

PrimaryDbConfig.java

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = "com.aoc.dao", entityManagerFactoryRef = "entityManager", transactionManagerRef = "transactionManager") 
public class PrimaryDBConfiguration { 

@Bean(name = "dataSource")  
@Primary 
@ConfigurationProperties(prefix = "primary.datasource") 
public DataSource dataSource() { 
     return DataSourceBuilder.create().build(); 
} 

@PersistenceContext(unitName = "primary") 
@Primary 
@Bean(name = "entityManager") 
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) { 
     return builder.dataSource(dataSource()) 
       .persistenceUnit("primary")     
       .packages("com.aoc.model") 
       .build(); 
} 

} 

SecondaryDbConfig.java

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = "com.aoc.dao", entityManagerFactoryRef = "secondaryEntityManager", transactionManagerRef = "secondaryTransactionManager") 
public class SecondaryDBConfiguration { 
    @Bean 
    @ConfigurationProperties(prefix = "secondary.datasource") 
    public DataSource secDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 
    @PersistenceContext(unitName = "secondary") 
    @Bean(name = "secondaryEntityManager") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) { 
     return builder.dataSource(secDataSource())     
       .persistenceUnit("secondary") 
       .packages("com.aoc.siri") 
       .build(); 
    } 

    @Bean(name = "secondaryTransactionManager") 
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) { 
     JpaTransactionManager tm = new JpaTransactionManager(); 
     tm.setEntityManagerFactory(entityManagerFactory(builder).getObject()); 
     tm.setDataSource(secDataSource()); 
     return tm; 
    }  
} 

Anotate與它的每一個DAO各自的PersistenceContextunitName

OneDaoImpl.java

@Repository(value = "OneDaoImpl") 
public class OneDaoImpl { 

@PersistenceContext(unitName="primary") 
private EntityManager manager; 

public List<AplicacioMsc> getAllOne() {  
    return (List<One>) manager.createQuery("FROM ONE", One.class).getResultList(); 
} 
} 

AnotherDaoImpl.java

@Repository(value = "anotherDaoImpl") 
public class AnotherDaoImpl { 

@PersistenceContext(unitName = "secondary") 
private EntityManager manager; 


public List<Producte> getAllAnother() {  
    return (List<Another>) manager.createQuery("FROM Another", Another.class).getResultList(); 
} 
} 

然後在你的src/main/resources/application.properties

primary.datasource.driver-class-name=... 
primary.datasource.url=... 
primary.datasource.username=xxx 
primary.datasource.password=yyy 

secondary.datasource.driver-class-name=... 
secondary.datasource.url=... 
secondary.datasource.username=zzz 
secondary.datasource.password=xxx 

正如你可能知道,如果你使用recommended Spring Boot packages naming這些類和偏移量,你應該能夠同時使用這兩個數據源。

+0

關於這個想法,我想將嵌入式數據庫添加到我現有的項目中,而不必手動重做。你上面的例子完美工作除了spring.jpa.properties.hibernate.dialect:org.hibernate.dialect.MySQL5Dialect不直接從屬性加載 – Shahbour