You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java EE+WildFly12环境H2+Hibernate插入数据遇ID非空报错求助

这个问题我遇过好几次了,核心原因是你的AUTHOR和BOOK表的ID字段作为主键,既没有设置自动增长规则,插入时又没手动指定ID值,H2数据库自然会抛出「NULL not allowed for column "ID"」的错误。下面给你几个可行的解决办法:

解决方法1:修改数据库表结构,让ID自动递增

H2数据库支持AUTO_INCREMENT(或者IDENTITY)关键字来实现主键自增,你可以把原有的建表语句改成这样:

CREATE TABLE AUTHOR (
    "ID" INTEGER primary key AUTO_INCREMENT,
    "FIRSTNAME" VARCHAR(50) not null,
    "SECONDNAME" VARCHAR(50) not null
);

CREATE TABLE BOOK (
    "ID" INTEGER primary key AUTO_INCREMENT,
    "TITLE" VARCHAR(50) not null,
    "AUTHOR" INTEGER,
    FOREIGN KEY ("AUTHOR") REFERENCES AUTHOR("ID")
);

修改后,你原来的INSERT语句就可以正常执行了——H2会自动为每条新插入的记录生成唯一的ID值。

解决方法2:在Hibernate实体类中配置主键生成策略

如果不想修改数据库表结构,你可以在对应的实体类(比如Author.java和Book.java)中,为id字段添加@GeneratedValue注解,指定自增策略:

@Entity
@Table(name = "AUTHOR")
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 关键配置
    @Column(name = "ID")
    private Integer id;

    @Column(name = "FIRSTNAME", nullable = false)
    private String firstName;

    @Column(name = "SECONDNAME", nullable = false)
    private String secondName;

    // 构造方法、getter、setter省略
}

同样,Book实体类的id字段也要做相同配置。这样Hibernate在执行插入操作时,会自动调用H2的自增机制生成ID,不需要你在INSERT语句中手动指定。

临时应急方案:手动指定ID值

如果只是临时测试,你也可以在INSERT语句中手动给ID赋值,比如:

INSERT INTO AUTHOR("ID", "SECONDNAME","FIRSTNAME") values (1, 'a', 'b');
INSERT INTO BOOK("ID", "TITLE","AUTHOR") values (1, 'bookTitle', 1);

不过这种方式不适合生产环境,因为你得自己保证ID的唯一性,很容易出现冲突。

内容的提问来源于stack exchange,提问作者halpdoge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:14:23