2017-08-06 2 views
1

私は、DATAJPAリポジトリと2つのデータソースでspring-bootを使用します。 1つのデータソースはMySQL DBに接続し、2番目のデータソースはファイルベースの埋め込みH2 DBに接続します。データ・ソースURLを変更した後にスプリング・ブートを使用してデータベース表を作成する方法

H2 DBで、アプリケーションの実行中にURLを変更したいと思います。 URLの変更作業と変更後に、既存のDBバネにURLを入力するとDBが作成されます。しかし、テーブルは作成されず、スプリングは私にTable "SYMBOL" not found; SQL statement:のようなエラーを与えます。 私は今すぐ私のアプリケーションを再起動すると、新しいURLでテーブルを作成し、すべて正常に動作します。

URLを変更してテーブルを作成する方法はありますか?

URLを変更するには、自分のデータソースを作成し、各接続時に新しいデータソースを作成します。

ここ
public class ProjectDataSource extends AbstractDataSource { 

    @Autowired ToolService toolService; 

    @Override 
    public Connection getConnection() throws SQLException { 
     return determineTargetDataSource().getConnection(); 
    } 

    @Override 
    public Connection getConnection(String username, String password) throws SQLException { 
     return determineTargetDataSource().getConnection(username, password); 
    } 

    @ConfigurationProperties(prefix = "project.datasource") 
    private DataSource determineTargetDataSource() { 
     String projectName = toolService.get().getProjectName(); 
     String url = "jdbc:h2:file:../db/" + projectName; 

     return DataSourceBuilder 
       .create() 
       .url(url) 
       .build(); 
    } 
} 

ここで設定

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "projectEntityManagerFactory", 
     transactionManagerRef = "projectTransactionManager", 
     basePackages = {"at.ltw.test.bz.model.project"}) 
public class ProjectDbConfiguration { 


    @Bean(name = "projectDataSource") 
    public DataSource dataSource() { 
     return new ProjectDataSource(); 
    } 

    @Bean(name = "projectEntityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean 
    barEntityManagerFactory(
      EntityManagerFactoryBuilder builder, 
      @Qualifier("projectDataSource") DataSource dataSource 
    ) { 

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

     return builder 
       .dataSource(dataSource) 
       .packages("at.ltw.test.bz.model.project") 
       .persistenceUnit("bzProject") 
       .properties(jpaVendorAdapter.getJpaPropertyMap()) 
       .build(); 
    } 

    @Bean(name = "projectTransactionManager") 
    public PlatformTransactionManager barTransactionManager(
      @Qualifier("projectEntityManagerFactory") EntityManagerFactory projectEntityManagerFactory) { 
     return new JpaTransactionManager(projectEntityManagerFactory); 
    } 

} 

私application.properties

#jpa 
spring.jpa.hibernate.ddl-auto=update 
spring.jpa.generate-ddl=true 

#tool database 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 
spring.datasource.url=jdbc:mysql://localhost/ltw?useSSL=false 
spring.datasource.username=ltw 
spring.datasource.password=password 

#project database 
project.datasource.driver-class-name=org.h2.Driver 

#logging 
logging.level.at.ltw = trace 

誰かが私を助け、私の悪い英語のため申し訳ありませんことを願って...

答えて

1

JPAはありませんDDLがチェックされているのは初期状態であるからです。

新しいDBを生成するには、flywayDBまたはliquibaseまたは単純なSQLファイルのようなものを使用する必要があります。

とにかくコードが間違っていて、私はあなたにエラーがないことを驚かせています。

@Bean(name = "projectDataSource") 
public DataSource dataSource() { 
    return new ProjectDataSource(); 
} 

何の注入が、シンプルな新しいオブジェクトとはありません... determineTargetDataSouceがnullポインタ例外で失敗しますので

public class ProjectDataSource extends AbstractDataSource { 
    @Autowired ToolService toolService; 

    @ConfigurationProperties(prefix = "project.datasource") 
    private DataSource determineTargetDataSource() { 
     String projectName = toolService.get().getProjectName(); 
     ... 
    } 

はtoolServiceは、nullになります。

関連する問題