[英]Problem with maven release:prepare for Spring Boot 2.3.1.RELEASE
[英]Is data.sql disabled in spring boot 2.3.1.RELEASE?
@SpringBootApplication
public class DatabaseDemoApplication implements CommandLineRunner {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
PersonJbdcDao dao;
public static void main(String[] args) {
SpringApplication.run(DatabaseDemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
// Thread.sleep(1000); --------------------------------------------------> line 1
logger.info("All users -> {}", dao.findAll());
}
}
@Repository
public class PersonJbdcDao {
@Autowired
JdbcTemplate jdbcTemplate;
public List<Person> findAll() {
return jdbcTemplate.query("select * from person",
new BeanPropertyRowMapper<Person>(Person.class));
}
}
在pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
我正在使用 h2 数据库。 以下是application.properties
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
人.class
private int id;
private String name;
private String location;
private Date birthDate;
// getter and setter
我在资源文件夹中还有一个data.sql
文件,其中包含创建和插入语句。 如果我保留第 1 行(Thread.sleep(1000)) 的注释并运行该项目,我将面临一个错误,但我可以通过 h2 控制台访问表 Person
java.lang.IllegalStateException: Failed to execute CommandLineRunner
Caused by: org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [select * from person]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "PERSON" not found; SQL statement:
select * from person [42102-200]
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "PERSON" not found; SQL statement:
select * from person [42102-200]
我有2个场景
data.sql
文件重命名为schema.sql
文件,则一切正常。 我可以访问为什么会这样?data.sql
文件并且不重命名它,我必须取消注释第 1 行才能使应用程序正常工作。 这是为什么? 由于 Spring Boot 2.3, JPA 存储库初始化是“延迟的” 。 所以run
方法在初始化之前运行(如果你没有定义任何 JPA 存储库)。
如果设置
spring.data.jpa.repositories.bootstrap-mode=default
在application.properties
上,按预期运行。
也可以看看:
DataSourceInitializerInvoker
javadoc说:
通过在
InitializingBean#afterPropertiesSet()
和data-*.sql
schema-*.sql
上运行DataSourceSchemaCreatedEvent
脚本来处理DataSource
初始化的 Bean
,并且DataSourceSchemaCreatedEvent
说:
当执行
schema-*.sql
文件或 Hibernate 初始化数据库时,会发生这种情况。
因此,在第一种情况下, data.sql
在 JPA(Hibernate) 初始化之后执行,但它是“延迟的”。 另一方面, schema.sql
在run()
之前执行,与早期版本相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.