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

如何使用Lombok为SpringBoot实体生成不含自增ID的部分参数构造器

报错原因

你当前的Game类仅通过Lombok生成了无参构造方法和包含gameId、User、blueIsWinner、yesIndeed四个字段的全参构造方法,不存在只有3个参数的构造方法,因此调用new Game(users, true, "yesIndeed")时会编译报错。

可行实现方案

方案1:使用Lombok的@Builder注解(推荐)

该方案不需要编写固定参数的构造方法,构造对象时灵活性更高,更适配JPA实体的生成主键场景:

  1. 给Game类添加@Builder、@NoArgsConstructor、@AllArgsConstructor注解(注意JPA实体必须保留无参构造):
@Entity
@Table(name = "game")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Game {
    @Id
    @GeneratedValue
    private Long gameId;
    // 原字段名首字母大写不符合Java规范,建议修改为users
    @ManyToMany
    private Set<User> users;
    private Boolean blueIsWinner;
    private String yesIndeed;
}
  1. Service层改用Builder模式构造对象:
Set<User> users = new HashSet<>();
users.add(currentUser);
users.add(opponentUser);
Game game = Game.builder()
        .users(users)
        .blueIsWinner(true)
        .yesIndeed("yesIndeed")
        .build();
Game savedGame = gameRepository.save(game);

存入数据库后,生成的gameId会自动回填到savedGame对象中。

方案2:手写指定参数的构造方法

如果你坚持使用构造传参的方式,直接在类中手写3参数构造方法即可,Lombok不会覆盖你手动编写的构造方法:

@Entity
@Table(name = "game")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Game {
    @Id
    @GeneratedValue
    private Long gameId;
    @ManyToMany
    private Set<User> users;
    private Boolean blueIsWinner;
    private String yesIndeed;

    // 手写3参数构造方法
    public Game(Set<User> users, Boolean blueIsWinner, String yesIndeed) {
        this.users = users;
        this.blueIsWinner = blueIsWinner;
        this.yesIndeed = yesIndeed;
    }
}

修改后原有Service层的构造代码可直接运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:54:02