Hibernate通过CrudRepository插入数据时ID为NULL报错求助
解决Spring+H2数据库ID自动生成失败的问题
问题根源
你手动创建的message表中,id字段仅设置为非空主键,但未配置自增属性。Hibernate的@GeneratedValue注解需要数据库端支持自动生成主键值,否则插入时会因实体类未赋值、数据库也不自动生成,导致ID为NULL触发错误。
具体解决方案
修改数据库表结构,添加自增属性
H2数据库中,给主键字段加上AUTO_INCREMENT即可支持自动生成ID:-- 新建表时的正确语句 CREATE TABLE `message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `body` CLOB, `channels` varchar(500) NOT NULL, `end_date` datetime DEFAULT NULL, `start` datetime DEFAULT NULL, `status` varchar(120) DEFAULT NULL, `title` varchar(120) DEFAULT NULL, `approved` bit(1) DEFAULT NULL, `approver_name` varchar(150) DEFAULT NULL, `approver_sub` varchar(120) DEFAULT NULL, `create_date` datetime DEFAULT NULL, `creator_name` varchar(150) DEFAULT NULL, `creator_sub` varchar(120) DEFAULT NULL, `modify_date` datetime DEFAULT NULL, `affiliations` varchar(500) NOT NULL, `html` bit(1) NOT NULL, `reject_reason` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) )如果表已存在,执行ALTER语句修改:
ALTER TABLE message MODIFY COLUMN id bigint(20) NOT NULL AUTO_INCREMENT;调整实体类主键注解
适配H2的自增逻辑,使用GenerationType.IDENTITY策略,同时移除冗余的length配置(bigint类型无需设置长度):@Entity public class Message { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false, unique = true) private long id; // 其他字段保持不变 }确认JPA配置
确保spring.jpa.hibernate.ddl-auto设置为update(或测试环境用create),让Hibernate能同步实体与表结构的匹配性。额外排查
- 检查初始化数据库的脚本,确保
id字段的自增配置已正确执行; - 排查代码中是否有手动给
id赋值的逻辑,避免覆盖自动生成的规则。
- 检查初始化数据库的脚本,确保
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

