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()方法。
解决步骤
修正getId()的返回类型为包装类Long
修改实体类的getId方法:public Long getId() { return id; }这样当id为null时,返回的是
null而非触发拆箱异常。统一Repository方法的参数类型
将Repository中的findById方法参数改为Long,保持与实体ID类型一致,避免后续其他场景的拆箱问题:EmlTplp findById(Long id);
额外排查点
- 确认数据库表的
emltplid字段是否配置为自增类型(比如MySQL的AUTO_INCREMENT),这是GenerationType.IDENTITY生效的前提; - 检查实体类的
equals()、hashCode()等方法是否调用了getId(),如果有,同样需要修正为使用包装类避免拆箱NPE。
内容的提问来源于stack exchange,提问作者M. A. Wheadon
相关产品推荐
相关产品推荐

