Spring Boot JPA插入Course实体到H2数据库long与null比较报错求助
问题根因
- Course实体类的
id属性定义为包装类型Long(新创建的对象初始值为null),但getId()方法的返回值写的是基本类型long:- 调用
course.getId()时,JVM会自动将Long类型的id拆箱为long,如果id为null,拆箱过程就会直接抛出空指针异常,和报错栈里的Cannot invoke "java.lang.Long.longValue() because "this.id" is null完全对应 - 基本类型
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
相关产品推荐
相关产品推荐

