如何在更改数据源URL后使用spring boot创建数据库表

时间:2017-08-06 06:34:19

标签: java spring-boot spring-data-jpa

我使用带有DATAJPA存储库和两个数据源的spring-boot。一个数据源连接到MySQL DB,第二个数据源连接到基于文件的嵌入式H2 DB。

在H2 DB上我希望在我的应用程序运行期间更改URL。 URL更改工作以及将URL更改为不存在的DB spring后会创建数据库。但表格不会创建,春天会给我一个像Table "SYMBOL" not found; SQL statement:这样的错误。 当我现在重新启动我的应用程序然后Spring使用新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 个答案:

答案 0 :(得分:1)

JPA不会帮助你,因为它只是在初始状态下检查DDL。

您需要使用flywayDB或liquibase或简单的SQL文件来生成新的数据库。

无论如何,你的代码是错误的,我很惊讶你没有错误。

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

没有注射,只有一个简单的新物体......

public class ProjectDataSource extends AbstractDataSource {
    @Autowired ToolService toolService;

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

toolService将为null,因此confirmTargetDataSouce将以空指针异常失败。