我将 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/