java - 更改数据源URL后如何使用Spring Boot创建数据库表

标签 java spring-boot spring-data-jpa

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

在 H2 DB 上,我想在应用程序运行期间更改 URL。 URL 更改工作,并将 URL 更改为不存在的数据库后,spring 创建数据库。但是表不会创建,并且 spring 给我一个错误,例如 Table "SYMBOL"not find; SQL语句:。 当我现在重新启动我的应用程序时,然后使用新的 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

希望有人能帮助我,并为我糟糕的英语感到抱歉......

最佳答案

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

您需要使用 FlywayDB 或 liquibase 或简单的 SQL 文件之类的东西来生成新的数据库。

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

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

没有注入(inject),而是一个简单的新对象......

public class ProjectDataSource extends AbstractDataSource {
    @Autowired ToolService toolService;

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

toolService 将为 null,因此确定TargetDataSouce 将失败并出现空指针异常。

关于java - 更改数据源URL后如何使用Spring Boot创建数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529275/

相关文章:

java - 将 JpaRepository 与 Spring Boot 一起使用

java - 运行集成测试时禁用 Spring Cloud Sleuth?

java - 没有可用的事务性 EntityManager 且异常 InvalidDataAccessApiUsageException

java - 如何使用 spring data jpa 仅更新模型中的传入字段?

java - 如何在 Spring Boot 应用程序中使用 JPA 删除/获取列表

java - 是否可以在java中创建用户定义的LOG级别?

java - Java 中的套接字编程

Spring Boot Java 映射实体到 DTO : array literal (strings) INSTEAD of array of objects

java - Java 中的通用 "filter"

java - 在 TestNG XML 中设置测试方法优先级