Встроенная база данных H2: файл sql не выполняется - PullRequest
0 голосов
/ 06 июля 2018

Я использую Spring Data JPA со встроенной базой данных H2. У меня есть два файла sql:

schema.sql

CREATE TABLE SINGER (
    ID INT NOT NULL AUTO_INCREMENT,
    FIRST_NAME VARCHAR(60) NOT NULL,
    LAST_NAME VARCHAR(60) NOT NULL,
    BIRTH_DATE DATE,

    CONSTRAINT UQ_SINGER UNIQUE (FIRST_NAME, LAST_NAME),
    PRIMARY KEY (ID)
);

CREATE TABLE ALBUM(
    ID INT NOT NULL AUTO_INCREMENT,
    SINGER_ID INT,
    TITLE VARCHAR(100) NOT NULL,
    RELEASE_DATE DATE,

    CONSTRAINT UQ_ALBUM UNIQUE (TITLE),
    CONSTRAINT FK_ALBUM FOREIGN KEY (SINGER_ID) REFERENCES SINGER (ID),
    PRIMARY KEY (ID)
);

data.sql

INSERT INTO SINGER (FIRST_NAME, LAST_NAME, BIRTH_DATE) VALUES ('John', 'Mayer', '1977-10-16');
INSERT INTO SINGER (FIRST_NAME, LAST_NAME, BIRTH_DATE) VALUES ('Eric', 'Clapton', '1945-03-30');
INSERT INTO SINGER (FIRST_NAME, LAST_NAME, BIRTH_DATE) VALUES ('Jorn', 'Butler', '1975-04-01');

INSERT INTO ALBUM (SINGER_ID, TITLE, RELEASE_DATE) VALUES (1, 'The Search For Everything', '2017-01-20');
INSERT INTO ALBUM (SINGER_ID, TITLE, RELEASE_DATE) VALUES (1, 'Battle Studies', '2009-11-17');
INSERT INTO ALBUM (SINGER_ID, TITLE, RELEASE_DATE) VALUES (2, 'From The Cradle', '1994-09-13');

Конфигурация базы данных:

@Bean
public DataSource dataSource() {
    try {
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.H2)
                .addScripts("db/schema.sql", "db/data.sql")
                .build();
    } catch (Exception ex) {
        log.error("Cannot create DataSource", ex);
        return null;
    }
}

Проблема: schema.sql выполняется, а data.sql нет. Все тесты (найти все данные, найти по идентификатору, вставить, обновить, удалить) успешно прошли

Журналы

INFO     [main] org.springframework.jdbc.datasource.init.ScriptUtils:510 -  Executed SQL script from class path resource [db/schema.sql] in 47 ms.
INFO     [main] org.springframework.jdbc.datasource.init.ScriptUtils:444 -  Executing SQL script from class path resource [db/data.sql]
DEBUG    [main] org.springframework.jdbc.datasource.init.ScriptUtils:476 -  1 returned as update count for SQL: INSERT INTO SINGER (FIRST_NAME, LAST_NAME, BIRTH_DATE) VALUES ('John', 'Mayer', '1977-10-16')
DEBUG    [main] org.springframework.jdbc.datasource.init.ScriptUtils:476 -  1 returned as update count for SQL: INSERT INTO SINGER (FIRST_NAME, LAST_NAME, BIRTH_DATE) VALUES ('Eric', 'Clapton', '1945-03-30')
DEBUG    [main] org.springframework.jdbc.datasource.init.ScriptUtils:476 -  1 returned as update count for SQL: INSERT INTO SINGER (FIRST_NAME, LAST_NAME, BIRTH_DATE) VALUES ('Jorn', 'Butler', '1975-04-01')
DEBUG    [main] org.springframework.jdbc.datasource.init.ScriptUtils:476 -  1 returned as update count for SQL: INSERT INTO ALBUM (SINGER_ID, TITLE, RELEASE_DATE) VALUES (1, 'The Search For Everything', '2017-01-20')
DEBUG    [main] org.springframework.jdbc.datasource.init.ScriptUtils:476 -  1 returned as update count for SQL: INSERT INTO ALBUM (SINGER_ID, TITLE, RELEASE_DATE) VALUES (1, 'Battle Studies', '2009-11-17')
DEBUG    [main] org.springframework.jdbc.datasource.init.ScriptUtils:476 -  1 returned as update count for SQL: INSERT INTO ALBUM (SINGER_ID, TITLE, RELEASE_DATE) VALUES (2, 'From The Cradle', '1994-09-13')
INFO     [main] org.springframework.jdbc.datasource.init.ScriptUtils:510 -  Executed SQL script from class path resource [db/data.sql] in 16 ms.
DEBUG    [main] org.springframework.jdbc.datasource.DataSourceUtils:340 -  Returning JDBC Connection to DataSource

Кажется, что data.sql выполнен успешно, но я не вижу данных (в тестовых методах), пока я их вставляю.

ОБНОВЛЕНИЕ: У меня есть следующие методы тестирования (все они успешно проходят, но в testFindAll () я не вижу никаких данных):

@Test
void testFindAll() {
    List<Singer> singers = singerRepository.findAll();
    assertNotNull(singers);
    displayAllSingers(singers);
}

@Test
void testInsert() {
    Singer singer = createSinger();
    singerRepository.insert(singer);
    assertNotNull(singer.getId());

    displayAllSingers(singerRepository.findAll());
}

Вам не нужно беспокоиться о реализации SingerRepository, она работает правильно (в testInsert () вы можете увидеть singerRepository.findAll (), и она работает, я вижу вставленного певца).

...