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

Hibernate生成负ID问题求助:插入H2数据库时ID为负且字段全NULL

解决H2数据库插入数据时ID为负数且字段全为NULL的问题

嘿,我来帮你排查这个问题!从你给出的信息来看,主要有两个核心问题:自动生成的ID是负数,以及所有字段都为NULL,咱们一个个来解决:

一、先搞定ID为负数的问题

你用了@SequenceGenerator来生成ID,但H2数据库里可能没有正确创建对应的序列,或者配置不匹配,导致Hibernate没法正常获取序列值,只能用临时的负数ID(这是Hibernate的一种临时标识策略,用于未持久化的实体)。

解决步骤:

  1. 检查H2中的序列是否存在
    打开H2控制台,执行这条SQL查询:

    SELECT * FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_NAME = 'SEQUENCE_TCUSTOMER';
    

    如果查询不到结果,说明序列还没创建,手动执行创建语句:

    CREATE SEQUENCE SEQUENCE_TCUSTOMER START WITH 1000 INCREMENT BY 100;
    

    注意这里的START WITH和INCREMENT BY要和你实体类里@SequenceGenerator的initialValue、allocationSize完全一致。

  2. 确认JPA方言配置正确
    确保你的配置文件(比如application.properties或者persistence.xml)里指定了H2的正确方言,这样Hibernate才能正确处理H2的序列:

    # Spring Boot 示例
    spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
    
  3. 避免手动设置ID
    保存实体时,绝对不要自己给uidpk赋值,让JPA自动生成,否则会干扰序列的正常工作。

二、解决所有字段为NULL的问题

这个问题大概率是你在插入数据时,没有给实体的其他字段赋值,或者字段的映射配置有问题:

解决步骤:

  1. 检查实体类的字段映射
    确保除了ID之外的其他字段都正确配置了映射,比如如果有一个username字段对应数据库的username列,要么加上@Column(name = "username")(更清晰),要么保持字段名和列名一致(JPA默认会自动映射)。举个例子:

    @Entity
    @Table(name = "tcustomer")
    public class Customer implements Serializable{
        // ... ID相关代码 ...
        
        @Column(name = "username")
        private String username;
        
        @Column(name = "email")
        private String email;
        
        // 别忘了添加getter和setter方法!
    }
    

    重点:一定要给所有字段添加getter和setter方法,否则JPA无法正确设置和读取字段值。

  2. 确保保存实体时赋值了字段
    在保存实体的代码里,必须给需要的字段赋值,比如:

    Customer customer = new Customer();
    customer.setUsername("test_user");
    customer.setEmail("test@example.com");
    // 调用save方法,比如Spring Data JPA的repository:
    customerRepository.save(customer);
    

    如果只是创建了空的Customer对象就保存,那所有字段自然都是NULL。

最后验证

完成上述步骤后,重新启动应用,插入数据,应该就能看到正常的ID(从1000开始),并且其他字段也能正确存储了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:55