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

Spring Data JPA调用save时getId返回空引发NPE问题求助

排查Spring Data JPA save方法调用getId()导致NPE的问题

核心原因:基本类型拆箱触发空指针

你的实体类中id字段是包装类Long,但getId()方法返回的是基本类型long。当新增实体时,ID还未被数据库生成(此时id为null),调用getId()会触发自动拆箱操作,直接抛出NullPointerException。

Spring Data JPA的save逻辑为什么会调用getId()

JpaRepository的save()方法会通过调用getId()判断实体状态:

  • 如果返回的ID为null,框架判定为新增操作,执行INSERT语句;
  • 如果返回的ID不为null,框架判定为更新操作,执行UPDATE语句。
    即使配置了ID自动生成,框架在执行插入前仍会先检查ID值,因此必然会调用getId()方法。

解决步骤

  1. 修正getId()的返回类型为包装类Long
    修改实体类的getId方法:

    public Long getId() {
        return id;
    }
    

    这样当id为null时,返回的是null而非触发拆箱异常。

  2. 统一Repository方法的参数类型
    将Repository中的findById方法参数改为Long,保持与实体ID类型一致,避免后续其他场景的拆箱问题:

    EmlTplp findById(Long id);
    

额外排查点

  • 确认数据库表的emltplid字段是否配置为自增类型(比如MySQL的AUTO_INCREMENT),这是GenerationType.IDENTITY生效的前提;
  • 检查实体类的equals()、hashCode()等方法是否调用了getId(),如果有,同样需要修正为使用包装类避免拆箱NPE。

内容的提问来源于stack exchange,提问作者M. A. Wheadon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:42:30