如何使用Lombok为SpringBoot实体生成不含自增ID的部分参数构造器
报错原因
你当前的Game类仅通过Lombok生成了无参构造方法和包含gameId、User、blueIsWinner、yesIndeed四个字段的全参构造方法,不存在只有3个参数的构造方法,因此调用new Game(users, true, "yesIndeed")时会编译报错。
可行实现方案
方案1:使用Lombok的@Builder注解(推荐)
该方案不需要编写固定参数的构造方法,构造对象时灵活性更高,更适配JPA实体的生成主键场景:
- 给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; }
- 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
相关产品推荐
相关产品推荐

