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
相关产品推荐
相关产品推荐

