![](/img/trans.png)
[英]Spring boot data.sql does not initialize data in Postgresql
[英]Spring boot not able to run data.sql to initialize DB
构建.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()
}
模式.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)
);
数据.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.javaba
@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() 测试总是通过,这意味着表被创建,但第二个总是失败,意味着 data.sql 没有被执行。 dao.count() 总是返回 0。我该如何解决这个问题?
spring.jpa.hibernate.ddl-auto=none
我在 application.properties 中添加了这一行,它解决了这个问题。 默认设置阻止 spring boot 运行 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.
您可以通过此属性指定要运行/执行的 SQL 文件:
spring.datasource.data=classpath:sql_script1.sql,classpath:sql_script2.sql
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.