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文件?