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

Spring整合Hibernate插入H2数据库报ID非空约束错误怎么解决

问题原因及解决方案

核心问题梳理

  1. 配置冲突:你同时维护了两套数据库连接配置,Spring Data JPA连接的是jdbc:h2:mem:db,而手动创建的Hibernate SessionFactory连接的是jdbc:h2:mem:test,两个完全独立的H2内存库,表结构不互通。
  2. 注解误用:@Modifying、@Query是Spring Data JPA的Repository层注解,不能标注在Controller的请求方法上,没有实际作用。
  3. 冗余代码:已经集成Spring Data JPA并注入了MemberRepository,无需手动管理Hibernate Session、事务,重复造轮子还容易出错。

修复步骤

步骤1:清理Controller层冗余代码与错误注解

修改后的Controller代码如下:

@RestController
public class DataAccessController {
    @Autowired
    private MemberRepository userRepo; 

    @GetMapping("/create-account")
    public String addUserToDatabase(@RequestParam(name = "token") String token,
            @RequestParam(name = "username") String username) {
        Member member = new Member(token, username);
        userRepo.save(member);
        return "Added user with token: " + token + " and username: " + username;
    }
}

步骤2:优化Member实体主键定义

将基础类型long改为包装类型Long,适配自增主键初始空值的场景,避免类型隐式转换问题:

@Entity
@Table(name = "MEMBER")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long ID;
    @Column(name = "token")
    private String token;
    @Column(name = "username")
    private String username;

    // 保留原有构造方法,仅将ID的getter/setter返回值/参数改为Long类型即可
    public Long getID() {
        return ID;
    }

    public void setID(Long iD) {
        ID = iD;
    }

    // 其余getter/setter保持不变
}

步骤3:删除冗余配置

如果没有特殊的原生Hibernate使用需求,直接删除hibernate.cfg.xml配置文件即可,避免后续配置冲突。

补充说明

新增操作使用GET请求不符合REST接口设计规范,生产环境建议改为POST请求,避免浏览器预加载、缓存等场景导致的重复写入问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:54:05