我使用带有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
希望有人可以帮助我,抱歉我的英语不好......
答案 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将以空指针异常失败。