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

Spring Boot JPA插入Course实体到H2数据库long与null比较报错求助

问题根因

  • Course实体类的id属性定义为包装类型Long(新创建的对象初始值为null),但getId()方法的返回值写的是基本类型long:
    1. 调用course.getId()时,JVM会自动将Long类型的id拆箱为long,如果id为null,拆箱过程就会直接抛出空指针异常,和报错栈里的Cannot invoke "java.lang.Long.longValue() because "this.id" is null完全对应
    2. 基本类型long不能和null做等值判断,所以写getId() == null时编译器会直接报== 运算符未定义的错误,改成==0也无法解决,因为拆箱过程会先抛出空指针。

解决方案

方案1(推荐):修改getId()方法的返回值为包装类型Long

把Course类里的getId方法调整为:

public Long getId() {
    return id;
}

修改后DAO层原有的if(course.getId()==null)判断逻辑不需要改动,就能正常识别未持久化的新对象。

方案2(不推荐):给id设置默认值0

如果坚持用基本类型long作为getId()的返回值,需要给id属性设置初始值:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id = 0L;

同时将DAO层的判断逻辑改成if(course.getId() == 0)即可,此方案存在风险,后续如果有业务场景将0作为合法id值会触发逻辑冲突。

额外优化建议

建议补全id的setter方法,避免后续JPA代理、反射赋值出现异常:

public void setId(Long id) {
    this.id = id;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:57:04