Spring boot Spring引导和数据库初始化工作不正常

Spring boot Spring引导和数据库初始化工作不正常,spring-boot,sql-scripts,Spring Boot,Sql Scripts,schema.sql中的脚本已执行,但data.sql中的脚本未执行, 不知道我错过了什么 我使用的是带有两个数据源的Spring Boot。我的数据库配置如下 spring.datasource.initialize=true spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=root spring.datasource.password= spring.datasource.driverC

schema.sql中的脚本已执行,但data.sql中的脚本未执行, 不知道我错过了什么

我使用的是带有两个数据源的Spring Boot。我的数据库配置如下

spring.datasource.initialize=true
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.show-sql: true
spring.jpa.hibernate.ddl-auto_mysql=update
spring.jpa.properties.hibernate.dialect_mysql=org.hibernate.dialect.MySQL5Dialect
@PropertySource({“classpath:application.properties”})
@配置
@授权代理(
basePackages=“com.projectx.mysql”,
entityManagerFactoryRef=“userEntityManager”,
transactionManagerRef=“userTransactionManager”
)
公共类数据库配置{
@自动连线
环境环境;
@豆子
@初级的
public LocalContainerEntityManagerFactoryBean用户实体管理器(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan(新字符串[]{“com.projectx.mysql”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”、env.getProperty(“spring.jpa.hibernate.ddl-auto_-mysql”);
properties.put(“hibernate.dialogue”,env.getProperty(“spring.jpa.properties.hibernate.dialogue_-mysql”);
properties.put(“hibernate.show_sql”,env.getProperty(“spring.jpa.show sql”);
em.setJpaPropertyMap(属性);
返回em;
}
@豆子
@ConfigurationProperties(前缀=“spring.datasource”)
公共数据源primaryDataSource(){
返回DataSourceBuilder.create().build();
}
@初级的
@豆子
公共平台TransactionManager用户TransactionManager(){
JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.SetEntityManager工厂(userEntityManager().getObject());
返回事务管理器;
}
}
和.properties文件配置如下

spring.datasource.initialize=true
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.show-sql: true
spring.jpa.hibernate.ddl-auto_mysql=update
spring.jpa.properties.hibernate.dialect_mysql=org.hibernate.dialect.MySQL5Dialect

我成功地实例化了2个数据源,并使用启动了其中一个数据源中的模式和数据。希望这能有所帮助,也许我错过了你的一些要求,使我的建议无效:(


对于ref(估计您已经看到了):

当我们看到类的内容通过*.sql文件负责数据库初始化时,问题在于数据源初始化

spring.datasource.initialize=true
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.show-sql: true
spring.jpa.hibernate.ddl-auto_mysql=update
spring.jpa.properties.hibernate.dialect_mysql=org.hibernate.dialect.MySQL5Dialect
@PostConstruct
公共void init(){
如果(!this.properties.isInitialize()){
debug(“已禁用初始化(未运行DDL脚本)”;
返回;
}
如果(this.applicationContext.getBeanNamesForType)(DataSource.class,false,
错误)。长度>0){
this.dataSource=this.applicationContext.getBean(dataSource.class);
}
if(this.dataSource==null){
debug(“未找到数据源,因此未初始化”);
返回;
}
runSchemaScripts();
} 
runSchemaScripts()方法将在执行hibernate架构创建和更新操作之前初始化数据,因此,如果未生成数据库架构,则这些方法将创建架构(如果在SQL脚本中提供),但我希望在创建/更新架构后执行操作,因为该类包含

@覆盖
ApplicationEvent上的公共无效(DataSourceInitializedEvent事件){
如果(!this.properties.isInitialize()){
debug(“已禁用初始化(未运行数据脚本)”;
返回;
}
//请注意,事件可能会发生多次,并且
//此处不使用事件数据源
如果(!this.initialized){
runDataScripts();
this.initialized=true;
}
}
如果在执行hibernate模式创建/更新操作后,我们使用spring boots默认的
Datasource
创建机制,则调用该函数。 但是当我自己创建
Datasource
时,它没有创建
DataSourceInitializedEvent
,因此数据初始化脚本
data.sql
没有执行。 因此,我将数据源创建逻辑更改为创建
DataSourceInitializedEvent
,如下所示,从而解决了我的问题

@Autowired
私有配置应用程序上下文应用程序上下文;
@豆子
@初级的
public LocalContainerEntityManagerFactoryBean用户实体管理器(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan(新字符串[]{“com.projectx.mysql”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”、env.getProperty(“spring.jpa.hibernate.ddl-auto_-mysql”);
properties.put(“hibernate.dialogue”,env.getProperty(“spring.jpa.properties.hibernate.dialogue_-mysql”);
properties.put(“hibernate.show_sql”,env.getProperty(“spring.jpa.show sql”);
em.setJpaPropertyMap(属性);
this.applicationContext.publishEvent(新数据源初始化事件(primaryDataSource());
返回em;
}
@豆子
@ConfigurationProperties(前缀=“spring.datasource”)
公共数据源primaryDataSource(){
返回DataSourceBuilder.create().build();
}

添加了
this.applicationContext.publishEvent(新的DataSourceInitializedEvent(primaryDataSource());
来创建
DataSourceInitializedEvent
事件

,供在SpringBoot 2.1+世界中偶然发现这个问题的人使用


首先,我认为是重要类的完整类名(“publishEvent”的对象…“org.springframework.boot.autoconfigure.jdbc.DataSourceInitializedEvent”

对于未来的读者来说,这门课似乎已经过时了