Spring 启动无法 运行 data.sql 初始化数据库
Spring boot not able to run data.sql to initialize DB
build.gradle
plugins {
id 'org.springframework.boot' version '2.2.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.spdemo'
version = '1.0'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude module: 'junit'
}
testImplementation 'org.junit.jupiter:junit-jupiter:5.4.0'
}
test {
useJUnitPlatform()
}
schema.sql
drop table IF EXISTS officers;
create TABLE officers (
id INT NOT NULL AUTO_INCREMENT,
rank VARCHAR(20) NOT NULL,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
);
data.sql
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'James', 'Kirk');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Jean-Luc', 'Picard');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Benjamin', 'Sisko');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Kathryn', 'Janeway');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Jonathan', 'Archer');
JdbcOfficerDAOTest.javba
@SpringBootTest
@ExtendWith(SpringExtension.class)
// @Transactional // tx for each test rolls back by default
public class JdbcOfficerDAOTest {
// @Qualifier("jdbcOfficerDAO")
private Logger logger = LoggerFactory.getLogger(JdbcOfficerDAOTest.class);
@Autowired
private OfficerDAO dao;
@Test
public void save() {
Officer officer = new Officer(Rank.LIEUTENANT, "Nyota", "Uhuru");
officer = dao.save(officer);
assertNotNull(officer.getId());
// assertTrue(!(officer == null));
logger.info("id is: " + officer.getId());
logger.info("I'm here");
}
@Test
public void findByIdThatExists() {
Optional<Officer> officer = dao.findById(1);
logger.info("here is the count: " + dao.count());
assertTrue(officer.isPresent());
// assertEquals(1, officer.get().getId().intValue());
}
}
当我 运行 上面的测试用例时,第一个 save() 测试总是通过,这意味着 table 被创建,但第二个总是失败,这意味着 data.sql 没有执行。而 dao.count() 总是 returns 0。
我怎样才能解决这个问题?
您可以通过 属性 :
将 SQL 个文件指定为 run/execute
spring.datasource.data=classpath:sql_script1.sql,classpath:sql_script2.sql
spring.jpa.hibernate.ddl-auto=none
我在 application.properties 中添加了这一行,它解决了这个问题。
默认设置阻止 spring 从 运行 data.sql
引导
DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property.
Defaults to "create-drop" when using an embedded database and no
schema manager was detected. Otherwise, defaults to "none".
none Disable DDL handling.
validate Validate the schema, make no changes to the database.
update Update the schema if necessary.
create Create the schema and destroy previous data.
create-drop Create and then destroy the schema at the end of the session.
build.gradle
plugins {
id 'org.springframework.boot' version '2.2.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.spdemo'
version = '1.0'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude module: 'junit'
}
testImplementation 'org.junit.jupiter:junit-jupiter:5.4.0'
}
test {
useJUnitPlatform()
}
schema.sql
drop table IF EXISTS officers;
create TABLE officers (
id INT NOT NULL AUTO_INCREMENT,
rank VARCHAR(20) NOT NULL,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
);
data.sql
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'James', 'Kirk');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Jean-Luc', 'Picard');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Benjamin', 'Sisko');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Kathryn', 'Janeway');
INSERT INTO officers(rank, first_name, last_name) VALUES('CAPTAIN', 'Jonathan', 'Archer');
JdbcOfficerDAOTest.javba
@SpringBootTest
@ExtendWith(SpringExtension.class)
// @Transactional // tx for each test rolls back by default
public class JdbcOfficerDAOTest {
// @Qualifier("jdbcOfficerDAO")
private Logger logger = LoggerFactory.getLogger(JdbcOfficerDAOTest.class);
@Autowired
private OfficerDAO dao;
@Test
public void save() {
Officer officer = new Officer(Rank.LIEUTENANT, "Nyota", "Uhuru");
officer = dao.save(officer);
assertNotNull(officer.getId());
// assertTrue(!(officer == null));
logger.info("id is: " + officer.getId());
logger.info("I'm here");
}
@Test
public void findByIdThatExists() {
Optional<Officer> officer = dao.findById(1);
logger.info("here is the count: " + dao.count());
assertTrue(officer.isPresent());
// assertEquals(1, officer.get().getId().intValue());
}
}
当我 运行 上面的测试用例时,第一个 save() 测试总是通过,这意味着 table 被创建,但第二个总是失败,这意味着 data.sql 没有执行。而 dao.count() 总是 returns 0。 我怎样才能解决这个问题?
您可以通过 属性 :
将 SQL 个文件指定为 run/executespring.datasource.data=classpath:sql_script1.sql,classpath:sql_script2.sql
spring.jpa.hibernate.ddl-auto=none
我在 application.properties 中添加了这一行,它解决了这个问题。 默认设置阻止 spring 从 运行 data.sql
引导 DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property.
Defaults to "create-drop" when using an embedded database and no
schema manager was detected. Otherwise, defaults to "none".
none Disable DDL handling.
validate Validate the schema, make no changes to the database.
update Update the schema if necessary.
create Create the schema and destroy previous data.
create-drop Create and then destroy the schema at the end of the session.