2017-11-06 16 views
3

私は実行時にデータベース間をルーティングするためにAbstractRoutingDatasourceを使用しています。 informixデータベース上の実際の状態では、すべて正常に動作します。Springで複数のデータベースを初期化する

テストでは、メモリH2データベースで使用するためのスプリングプロファイルを作成しました。 テストプロファイルを使用してSpringアプリケーションを実行した後、h2コンソールを使用してローカルデータベースをチェックしました。スキーマは作成されませんでした。

私はrecourcesでschema.sqlを使用してみましたし、ハイバネーション:私は "ルーティングされた" データソースを生成しようとしているIST休止状態を理解したよう

generate-ddl: true 
hibernate: 
    ddl-auto: create-drop 

Hibernateは

java.lang.IllegalStateException: Cannot determine target DataSource for lookup key [null] 

をスローします。 DatabaseContextHolderが設定されていないため(null)、これは失敗します。

したがって、両方の方法が失敗します。

(同じ)スキーマを持つすべてのデータベースを初期化する方法はありますか?

私の設定は以下のとおりです。

bootstrap.yml:

spring: 
    profiles: acceptanceTest 
    config: 
    name: standalone 
    cloud: 
    config: 
     enabled: false 
     discovery: 
     enabled: false 
    jpa: 
    database-platform: org.hibernate.dialect.H2Dialect 
    generate-ddl: true 
    hibernate: 
     ddl-auto: create-drop 
    properties: 
     hibernate: 
     show_sql: false 
     use_sql_comments: false 
     format_sql: false 
    h2: 
    console: 
     enabled: true 
     path: /h2 
datasource: 
    mc: 
    driver-class-name: 'org.h2.Driver' 
    url: 'jdbc:h2:mem:test-mc-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE' 
    username: sa 
    password: '' 
    platform: h2 
    initialize: true 
    type: com.zaxxer.hikari.HikariDataSource 
    hikari: 
     maximum-pool-size: 10 
     minimum-idle: 0 
     idle-timeout: 60000 
     pool-name: MarkHikariPool 
    cw: 
    driver-class-name: 'org.h2.Driver' 
    url: 'jdbc:h2:mem:test-cw-db' 
    username: sa 
    password: '' 
    type: com.zaxxer.hikari.HikariDataSource 
    hikari: 
     maximum-pool-size: 10 
     minimum-idle: 0 
     idle-timeout: 60000 
     pool-name: MarkHikariPool 

MainApp.java:

@ComponentScan({ "de.md.mark" }) 
@EnableDiscoveryClient 
@SpringBootApplication(
    exclude = 
     { 
      DataSourceAutoConfiguration.class, 
      DataSourceTransactionManagerAutoConfiguration.class, 
      HibernateJpaAutoConfiguration.class 
     } 
) 
public class MainApp 
{ 
    public static void main(String[] args) 
    { 

DataSourceConfiguration.java:多くの研究の後

@Configuration 
@EnableJpaRepositories(
    basePackageClasses = { MarkTypeRepository.class, MarkRepository.class }, entityManagerFactoryRef = "markEntityManager", 
    transactionManagerRef = "markTransactionManager" 
) 
@EnableTransactionManagement 
public class DataSourceConfiguration 
{ 
    @Autowired(required = false) 
    private PersistenceUnitManager persistenceUnitManager; 

    @Bean 
    @ConfigurationProperties("app.jpa") 
    @Primary 
    public JpaProperties jpaProperties() 
    { 
     return new JpaProperties(); 
    } 

    @Bean 
    @ConfigurationProperties(prefix = "datasource.mc") 
    public DataSource mcDataSource() 
    { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    @ConfigurationProperties(prefix = "datasource.cw") 
    public DataSource cwDataSource() 
    { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    @Primary 
    public DataSource dataSource() 
    { 
     DataSourceRouter router = new DataSourceRouter(); 

     final HashMap<Object, Object> map = new HashMap<>(DatabaseEnvironment.values().length); 
     map.put(DatabaseEnvironment.MC, mcDataSource()); 
     map.put(DatabaseEnvironment.CW, cwDataSource()); 
     router.setTargetDataSources(map); 
     return router; 
    } 

    @Bean 
    @Primary 
    public LocalContainerEntityManagerFactoryBean markEntityManager(final JpaProperties jpaProperties) 
    { 
     EntityManagerFactoryBuilder builder = createEntityManagerFactoryBuilder(jpaProperties); 

     return builder.dataSource(dataSource()).packages(MarkTypeEntity.class).persistenceUnit("markEntityManager").build(); 
    } 

    @Bean 
    @Primary 
    public JpaTransactionManager markTransactionManager(@Qualifier("markEntityManager") final EntityManagerFactory factory) 
    { 
     return new JpaTransactionManager(factory); 
    } 

    private EntityManagerFactoryBuilder createEntityManagerFactoryBuilder(JpaProperties jpaProperties) 
    { 
     JpaVendorAdapter jpaVendorAdapter = createJpaVendorAdapter(jpaProperties); 
     return new EntityManagerFactoryBuilder(jpaVendorAdapter, jpaProperties.getProperties(), this.persistenceUnitManager); 
    } 

    private JpaVendorAdapter createJpaVendorAdapter(JpaProperties jpaProperties) 
    { 
     AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 
     adapter.setShowSql(jpaProperties.isShowSql()); 
     adapter.setDatabase(jpaProperties.getDatabase()); 
     adapter.setDatabasePlatform(jpaProperties.getDatabasePlatform()); 
     adapter.setGenerateDdl(jpaProperties.isGenerateDdl()); 
     return adapter; 
    } 
} 

答えて

1

私は解決策を見つけた最後の2日間ですべてのデータソースを初期化します。 私は、HibernateのSchemaExport.classを使ってローカルH2データベースを作成し、初期化するメソッドを作成しました。 私はテストのためにローカルデータベースが必要なだけなので、@ Biefore Cucumberメソッドで各DatabaseEnvirementのメソッドを呼び出します。

public void createDatabase(DatabaseEnvironment environment) 
throws Exception 
{ 
    // load hibernate configuration from hibernate.cfg.xml in classpath 
    Configuration configuration = new Configuration().configure(); 
    MetadataSources metadata = 
    new MetadataSources(new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build()); 

    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(true); 
    scanner.addIncludeFilter(new AnnotationTypeFilter(Entity.class)); 

    for (BeanDefinition def : scanner.findCandidateComponents(MarkEntity.class.getPackage().getName())) 
    { 
     metadata.addAnnotatedClass(Class.forName(def.getBeanClassName())); 
    } 

    Connection connection = DriverManager.getConnection("jdbc:h2:mem:test-" + environment.name().toLowerCase(), "sa", ""); 

    SchemaExport export = new SchemaExport((MetadataImplementor) metadata.buildMetadata(), connection); 
    export.create(true, true); 
} 


@Before 
public void beforeTest() 
    throws Exception 
{ 
    // initialise databases 
    for (DatabaseEnvironment env : DatabaseEnvironment.values()) 
    { 
     createDatabase(env); 
    } 
} 

、これが私のhibernate.cfg.xmlのは、どのように見えるかです:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 

     <property name="dialect">org.hibernate.dialect.H2Dialect</property> 

     <property name="show_sql">true</property> 

     <property name="hbm2ddl.auto">create-drop</property> 

    </session-factory> 
</hibernate-configuration> 
関連する問題