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

使用Lombok的@Data与@Builder后无参构造器异常问题求助

解决JPA实体类@Builder与无参构造器冲突问题

问题分析

你的编译错误和注解冲突问题,核心是Lombok多个注解的行为叠加导致:

  1. 编译错误根源:

    • @Builder会自动生成全参构造器,根据Java语法,类中存在显式构造器时,默认的无参构造器不再自动生成。
    • JPA的@Entity要求实体类必须提供无参构造器用于实例化对象,因此JPA尝试创建Student实例时找不到无参构造,抛出编译错误。
  2. 添加@NoArgsConstructor提示已定义的原因:

    • @Data注解包含@RequiredArgsConstructor,该注解会生成包含所有final或@NonNull修饰字段的构造器。
    • 你的Student类没有final或@NonNull修饰的字段,所以@RequiredArgsConstructor会自动生成一个无参构造器。此时手动添加@NoArgsConstructor,会和这个自动生成的构造器重复,编译器因此提示“无参构造器已定义”。

解决方案

在类上同时添加@NoArgsConstructor和@AllArgsConstructor注解,配合原有的@Data、@Builder即可解决问题:

修改后的代码:

@Entity
@Table(name = "student_details")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    @Id
    private int studentId;
    private String studentName;
    private String courseEnrolled;
    private String rollNo;
}

注解作用说明:

  • @NoArgsConstructor:显式生成无参构造器,统一Lombok的构造器生成逻辑,避免和@RequiredArgsConstructor的自动生成逻辑冲突。
  • @AllArgsConstructor:生成全参构造器,供@Builder内部使用(建造者模式依赖全参构造器完成对象构建)。
  • @Data:提供getter、setter、toString、equals等基础方法。
  • @Builder:保留链式构建对象的能力。

这个配置既满足JPA对无参构造器的要求,又能正常使用建造者模式,同时解决了注解冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:41:29