Java H2数据库无法在列中设置默认值,即使通过Spring Boot在架构中指定

Java H2数据库无法在列中设置默认值,即使通过Spring Boot在架构中指定,java,spring,spring-boot,spring-data-jpa,h2,Java,Spring,Spring Boot,Spring Data Jpa,H2,我正在尝试使用H2DB和springboot创建一个非常简单的基于REST的API 除了从import.sql文件插入数据这一部分外,其他一切似乎都正常工作 即使架构将默认值指定为Y和notnull(参见下图),表中的ACTIVE列也不会填充数据 src/main/resources/schema.sql DROP TABLE IF EXISTS COUNTRY; CREATE TABLE IF NOT EXISTS COUNTRY( COUNTRY_ID SERIAL PRIMARY

我正在尝试使用
H2
DB和
springboot
创建一个非常简单的基于
REST
API

除了从
import.sql
文件插入数据这一部分外,其他一切似乎都正常工作

即使架构将默认值指定为
Y
notnull
(参见下图),表中的
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
);
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');
spring:
    application:
        name: country-service

#Datasource settings
    datasource:
        url: jdbc:h2:file:~/test
        username: sa
        password: 
        driver-class-name: org.h2.Driver        
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
src/main/resources/import.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
);
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');
spring:
    application:
        name: country-service

#Datasource settings
    datasource:
        url: jdbc:h2:file:~/test
        username: sa
        password: 
        driver-class-name: org.h2.Driver        
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
application.yml

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
);
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');
spring:
    application:
        name: country-service

#Datasource settings
    datasource:
        url: jdbc:h2:file:~/test
        username: sa
        password: 
        driver-class-name: org.h2.Driver        
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
pom.xml

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
);
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');
spring:
    application:
        name: country-service

#Datasource settings
    datasource:
        url: jdbc:h2:file:~/test
        username: sa
        password: 
        driver-class-name: org.h2.Driver        
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

com.h2数据库
氢
运行时

我相信Spring boot正在执行ddl auto=createDrop,数据是否会在应用程序结束后保留?改为在application.yml中指定
validate
。我在查找答案时看到的一件事是,默认值是在nullability之后指定的。不过,评论中的人对模式的看法绝对正确,如果它真的是
notnull
h2,则在尝试将列值设置为NULL时会抛出错误。
好吧,那肯定是

您可以显式设置spring.jpa.hibernate.ddl-auto,标准hibernate属性值为none、validate、update、create、create drop。Spring Boot根据是否认为数据库已嵌入(默认创建删除)为您选择默认值(默认无)。


默认值为createdrop,它创建运行应用程序的模式,然后将其删除。如果您计划自己创建模式,请选择“无”或“验证”

您使用了不同的模式,它仍然能够创建表和插入数据,除了我所说的一列数据。如果您有任何指针,我将非常乐意修复模式。您发布的模式和正在使用的模式不一样。找出您在哪个其他地方创建了
国家
表。我在h2中发现了相同的问题。这似乎不尊重违约,我对此还不清楚。首先,数据不会在应用程序结束后保留。第二件事,我切换了NOTNULL和默认的“Y”值,并再次测试了它,但没有成功是的,它是ddl自动设置,然后。。。请参见2 minNope中的编辑,此解决方案不起作用。我尝试了spring.jpa.hibernate.ddl auto=none和spring.jpa.hibernate.ddl auto=validate并重新运行应用程序。但是没有成功。@user2325154如果Hibernate从头开始创建架构(即如果
ddl auto
属性设置为
create
create drop
),则在启动时将执行类路径根目录中名为
import.sql
的文件。不适用于
validate
none
这是否意味着我的import.sql将在服务器启动时执行,从而完全忽略我的schema.sql文件?