简体   繁体   English

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

[英]H2 database not able to set default value in a column even though specified in the schema through Spring Boot

I am trying to create a very simple REST -based API using H2 DB and Spring Boot . 我正在尝试使用H2 DB和Spring Boot创建一个非常简单的基于RESTAPI

Everything seems to work fine except one part which is the data insertion from import.sql file. 除了其中一部分是从import.sql文件插入数据之外,其他所有内容似乎都正常运行。

The ACTIVE column in the table does not get populated with data even though the schema specified the default value as Y and NOT NULL (See image below). 即使架构将默认值指定为YNOT NULL也不会在表中的ACTIVE列中填充数据(请参见下图)。

在此处输入图片说明

src/main/resources/schema.sql 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 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 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 pom.xml

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

I beleive Spring boot is doing ddl-auto=createDrop, does the data stay after the application ends? 我相信Spring引导正在执行ddl-auto = createDrop,应用程序结束后数据是否仍保留? specify validate in your application.yml instead. 在您的application.yml中指定validate 1 thing that i saw in looking up answers is the default was specified after nullability. 我在查找答案时看到的一件事是可空性后指定了默认值。 the guys in the comments are definitely right about the schema though, if it was really NOT NULL h2 would throw error when trying to set column value to null. 但是,注释中的人肯定对架构是正确的,如果确实NOT NULL ,则在尝试将列值设置为null时,h2会引发错误。
ok so it's definitely Spring boot auto config .. 好的,所以肯定是Spring boot auto config ..

You can set spring.jpa.hibernate.ddl-auto explicitly and the standard Hibernate property values are none, validate, update, create, create-drop. Spring Boot chooses a default value for you based on whether it thinks your database is embedded (default create-drop) or not (default none).

default is create-drop which creates the schema runs the app then drops it. 默认值为create-drop,它会创建模式,然后运行应用程序,然后将其删除。 If you plan to create the schema yourself choose none or validate. 如果您打算自己创建模式,请选择不选择或验证。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM