2017-06-15 5 views
0

同じアプリケーションで2つのMySQL DBを使用してSpringBootを構成しました。 異なるパッケージの2つのDB。複数のDB構成例外を含むSpringBoot

  1. com.appscook.keycloak.usermanagement.sdk.entity
  2. com.appscook.library.domain

プロパティファイル

#SDK DB CONFIG 
keycloaksdk.datasource.driver-class-name = com.mysql.jdbc.Driver 
keycloaksdk.datasource.url = jdbc:mysql://localhost:3307/organization?autoReconnect=true 
keycloaksdk.datasource.username=root 
keycloaksdk.datasource.password=password 

#LIBRARY DB CONFIG 
library.datasource.driver-class-name = com.mysql.jdbc.Driver 
library.datasource.url = jdbc:mysql://192.168.0.188:3306/library_keycloak?autoReconnect=true 
library.datasource.username = jijesh 
library.datasource.password = jijesh 


# Keep the connection alive if idle for a long time (needed in production) 
spring.datasource.testWhileIdle = true 
spring.datasource.timeBetweenEvictionRunsMillis = 60000 
spring.datasource.validationQuery = SELECT 1 
# Number of ms to wait before throwing an exception if no connection is available. 
spring.datasource.max-wait=10000 
# Maximum number of active connections that can be allocated from this pool at the same time. 
spring.datasource.max-active=50 
# Validate the connection before borrowing it from the pool. 
spring.datasource.test-on-borrow=true 

# Show or not log for each sql query 
spring.jpa.show-sql = true 
spring.jpa.generate-ddl=true 
# Hibernate ddl auto (create, create-drop, update) 
spring.jpa.hibernate.ddl-auto= 
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect 
hibernate.temp.use_jdbc_metadata_defaults = false 

# Naming strategy 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy 

# The SQL dialect makes Hibernate generate better SQL for the chosen database 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 

DB1の設定

@Configuration 
@ComponentScan("com.appscook.library.service") 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "libraryEntityManagerFactory", 
     transactionManagerRef = "libraryTransactionManager", 
     basePackages = "com.appscook.library.repository") 
public class LibraryDBConfig { 
    @Bean 
    @Primary 
    @ConfigurationProperties(prefix = "library.datasource") 
    public DataSource hrmsDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean libraryEntityManagerFactory(
      final EntityManagerFactoryBuilder builder) { 
     return builder.dataSource(hrmsDataSource()) 
       .packages("com.appscook.library.domain") 
       .persistenceUnit("libraryPersistenceUnit").build(); 
    } 

    @Bean 
    public JpaTransactionManager hrmsTransactionManager(
      @Qualifier("libraryEntityManagerFactory") final EntityManagerFactory factory) { 
     return new JpaTransactionManager(factory); 
    } 
} 

@Configuration 
@ComponentScan("com.appscook.keycloak.usermanagement.sdk.services") 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "keycloakEntityManagerFactory", 
     transactionManagerRef = "keycloakTransactionManager", 
     basePackages = "com.appscook.keycloak.usermanagement.sdk.repository") 
public class KeycloakSDKDBConfig { 
    @Bean 
    @ConfigurationProperties(prefix = "keycloaksdk.datasource") 
    public DataSource keycloakDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean keycloakEntityManagerFactory(
      final EntityManagerFactoryBuilder builder) { 
     return builder.dataSource(keycloakDataSource()) 
       .packages("com.appscook.keycloak.usermanagement.sdk.entity") 
       .persistenceUnit("keycloakPersistenceUnit").build(); 
    } 

    @Bean 
    public JpaTransactionManager keycloakTransactionManager(
      @Qualifier("keycloakEntityManagerFactory") final EntityManagerFactory factory) { 
     return new JpaTransactionManager(factory); 
    } 
} 

私はアプリにNoUniqueBeanDefinitionExceptionを示すコンソールを実行されるDB2の設定。

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: libraryEntityManagerFactory,keycloakEntityManagerFactory 

答えて

0

あなたはopenEntityManagerInViewInterceptor豆に問題がある場合は、アプリケーションのプロパティファイルで spring.jpa.open-in-view=falseを設定します。 documentationに記載されているように、このBeanはデフォルトのEntityManager(デフォルトのEntityManagerFactoryから取得)を要求スレッドにバインドしますが、何らかの理由でこれがデフォルトでオンになっています。

あなたはまた、主要工場の一つにすることを検討することができます

@Bean 
@Primary 
public LocalContainerEntityManagerFactoryBean libraryEntityManagerFactory(
     final EntityManagerFactoryBuilder builder) { 
    return builder.dataSource(hrmsDataSource()) 
      .packages("com.appscook.library.domain") 
      .persistenceUnit("libraryPersistenceUnit").build(); 
} 
関連する問題