Данные. sql отключены в весенней загрузке 2.3.1.RELEASE? - PullRequest
1 голос
/ 16 июня 2020
@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));
    }
}

In 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=

Person.class

private int id;
private String name;
private String location;
private Date birthDate;

// getter and setter

У меня также есть файл data.sql в папке ресурсов, в котором есть операторы создания и вставки. Если я сохраню строку 1 (Thread.sleep (1000)), прокомментировал и запустил проект, я столкнулся с ошибкой, но я могу получить доступ к таблице Person через консоль h2

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 сценария ios

  1. Если я оставлю комментарий к строке 1 и переименую data.sql файл в schema.sql файл, все будет работать отлично. Я могу получить доступ, почему это?
  2. Если я сохраню файл data.sql и не переименую его, мне придется раскомментировать строку 1, чтобы приложение заработало. Почему?

1 Ответ

4 голосов
/ 16 июня 2020

Начиная с Spring Boot 2.3, инициализация репозитория JPA "отложена" . Итак, метод run запускается перед его инициализацией (если вы не определяете никаких репозиториев JPA).

Если установлено

spring.data.jpa.repositories.bootstrap-mode=default

на application.properties, запускайте, как вы ожидали.

см. Также:


DataSourceInitializerInvoker javado c говорит:

Bean для обработки инициализации DataSource путем запуска сценариев schema-*.sql на InitializingBean#afterPropertiesSet() и data-*.sql SQL на DataSourceSchemaCreatedEvent.

и DataSourceSchemaCreatedEvent говорит:

Это происходит, когда schema-*.sql файлы выполняются или когда Hibernate инициализирует базу данных.

Итак, в первом сценарии data.sql выполняется после JPA ( Hibernate) инициализация, но она "отложенная". С другой стороны, schema.sql выполняется перед run(), как и в более ранней версии.

...