我正在尝试使用 H2
DB 和 Spring Boot
创建一个非常简单的基于 REST
的 API
。
一切似乎都工作正常,除了从 import.sql
文件插入数据的部分。
即使架构将默认值指定为 Y
和 NOT NULL
,表中的 ACTIVE
列也不会填充数据(参见下图)。
src/main/resources/schema.sql
DROP TABLE IF EXISTS COUNTRY;
CREATE TABLE IF NOT EXISTS COUNTRY(
COUNTRY_ID SERIAL PRIMARY KEY,
COUNTRY_NAME VARCHAR(100) NOT NULL,
ISO_ALPHA2_CODE VARCHAR(2) NOT NULL,
ISO_ALPHA3_CODE VARCHAR(3) NOT NULL,
ISO_NUMERICAL_CODE INTEGER NOT NULL,
ACTIVE CHAR(1) DEFAULT 'Y' NOT NULL
);
src/main/resources/import.sql
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Afghanistan','AF','AFG','4');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Aland Islands','AX','ALA','248');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Albania','AL','ALB','8');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Algeria','DZ','DZA','12');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('American Samoa','AS','ASM','16');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Andorra','AD','AND','20');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Angola','AO','AGO','24');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Anguilla','AI','AIA','660');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Antarctica','AQ','ATA','10');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Antigua and Barbuda','AG','ATG','28');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Argentina','AR','ARG','32');
INSERT INTO COUNTRY (COUNTRY_NAME,ISO_ALPHA2_CODE,ISO_ALPHA3_CODE,ISO_NUMERICAL_CODE) VALUES ('Armenia','AM','ARM','51');
application.yml
spring:
application:
name: country-service
#Datasource settings
datasource:
url: jdbc:h2:file:~/test
username: sa
password:
driver-class-name: org.h2.Driver
pom.xml
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
最佳答案
我相信 Spring boot 正在执行 ddl-auto=createDrop,应用程序结束后数据会保留吗?请在 application.yml 中指定 validate
。我在查找答案时看到的一件事是默认值是在可空性之后指定的。不过,评论中的人对架构的看法肯定是正确的,如果它确实是 NOT NULL
h2 在尝试将列值设置为 null 时会抛出错误。
好吧,那肯定是 Spring boot auto config ..
您可以显式设置 spring.jpa.hibernate.ddl-auto ,标准 Hibernate 属性值为 none、validate、update、create、create-drop。 Spring Boot 根据它认为您的数据库是否嵌入(默认创建-删除)或不嵌入(默认无)来为您选择默认值。
默认是create-drop,它创建模式运行应用程序然后删除它。如果您计划自己创建架构,请选择“无”或“验证”。
关于java - 即使通过 Spring Boot 在架构中指定,H2 数据库也无法在列中设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47423688/