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

Spring Data JPA(Hibernate)无ID实体保存失败的原因与解决方法

问题分析与解决

场景重现

现有一个仅包含id和name字段的实体类,代码定义如下:

@lombok.Data
class Entity {
  @javax.persistence.Id
  UUID id;
  String name;
}

对应的数据库表结构:

create table entity (
  id uniqueidentifier not null primary key default newid(),
  name varchar(max)
);

执行以下代码时无法正常运行:

UUID savedId = entityRepository.save(new Entity().setName("entity name")).getId();

问题原因

Lombok的@Data注解默认生成的setter方法返回值为void,而非实体对象本身。因此new Entity().setName("entity name")这部分代码的返回值是void,无法作为entityRepository.save()方法的参数传入,这行代码连编译都无法通过。

解决办法

方法一:开启Lombok链式调用支持

在实体类上添加@Accessors(chain = true)注解,让Lombok生成返回当前对象的setter方法,实现链式调用:

@lombok.Data
@lombok.experimental.Accessors(chain = true)
class Entity {
  @javax.persistence.Id
  UUID id;
  String name;
}

修改后原代码即可正常执行,因为setName()现在会返回Entity对象,能顺利传入save()方法。

方法二:分步创建并保存对象

放弃链式调用,拆分代码步骤,先创建对象、设置属性,再执行保存操作:

Entity entity = new Entity();
entity.setName("entity name");
Entity savedEntity = entityRepository.save(entity);
UUID savedId = savedEntity.getId();

这种方式不需要修改实体类注解,逻辑更直观,也能避免链式调用可能带来的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:46:01