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

标签 java spring spring-boot spring-data-jpa h2

我正在尝试使用 H2 DB 和 Spring Boot 创建一个非常简单的基于 RESTAPI

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

即使架构将默认值指定为 YNOT NULL,表中的 ACTIVE 列也不会填充数据(参见下图)。

enter image description here

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/

相关文章:

java - 以编程方式设置 ImageView 资源不起作用

java - Spring 3.0 安全性不适用于基于注释的 Controller

java - Spring @Transactional 持久方法不起作用

java - Spring Boot中两个实体之间的多对多关系

java - Thymeleaf 片段有时不起作用

java - Spring数据库事务未在Db中提交数据

java - 尝试从迭代器中删除 SelectionKey 时抛出 UnsupportedOperationException

java - 是否可以在没有生成查询类型的情况下使用 Querydsl?

spring - 具有自动配置功能的 Spring Data JPA 应用程序的多个数据库

java - 为什么 sun.misc.Unsafe 存在,在现实世界中如何使用?