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
相关产品推荐
相关产品推荐

