Spring整合Hibernate插入H2数据库报ID非空约束错误怎么解决
问题原因及解决方案
核心问题梳理
- 配置冲突:你同时维护了两套数据库连接配置,Spring Data JPA连接的是
jdbc:h2:mem:db,而手动创建的Hibernate SessionFactory连接的是jdbc:h2:mem:test,两个完全独立的H2内存库,表结构不互通。 - 注解误用:
@Modifying、@Query是Spring Data JPA的Repository层注解,不能标注在Controller的请求方法上,没有实际作用。 - 冗余代码:已经集成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
相关产品推荐
相关产品推荐

