繁体   English   中英

在 spring 启动 2.3.1.RELEASE 中是否禁用了 data.sql?

[英]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个场景

  1. 如果我保留第 1 行的注释并将data.sql文件重命名为schema.sql文件,则一切正常。 我可以访问为什么会这样?
  2. 如果我保留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.sqlrun()之前执行,与早期版本相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM