私は実行時にデータベース間をルーティングするために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;
}
}