Lombok @Data 和 @Builder 在同一实体上

问题描述 投票:0回答:4

我正在使用以下内容:

@Entity
@Data
@Builder
@NoArgsConstructor(force = true)
public class User {
    private String id;
    private String firstName;
    private String lastName;
}

我想要实现的目标:对于 JPA 使用,我需要一个带有 noArgConstructor、getters/setters 和 equals/hashCode/toString 的 POJO。

对于实例创建(例如在测试中)我想使用 User.builder().build();

问题:它无法编译,NoArgConstructor 与RequiredFieldsConstructor 似乎存在问题:

Error:(15, 1) java: constructor User in class x.y.z.User cannot be applied to given types;
required: no arguments
found:    java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String
reason: actual and formal argument lists differ in length

更新:当我尝试通过

new
创建新实体时发生错误... builder() 有效。

我想念什么?不是可以同时使用@Data、@Entity和@Builder吗?

java lombok
4个回答
18
投票

使用 lombok 版本 1.16.18 尝试此代码:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
    private String id;
    private String firstName;
    private String lastName;
}

9
投票

注意数据对象不是实体!简而言之,hashcode/equals(当考虑 id 字段时)以及实体的延迟加载部分的 toString 方法都存在问题。作为参考,您可以查看Vlad Mihalceas 文章

你应该:

  • 从 hashcode/equals 中排除 id 字段
  • 从 hashcode/equals 中排除给定实体中未管理的关联字段
  • 从 toString 方法中排除所有延迟加载的字段
  • 排除可能导致 toString 方法循环引用的字段

在确信您的手写或生成的 equals/hashcode 方法没问题之前,请务必至少阅读一些有关 JPA 如何执行“脏检查”的内容。


4
投票

我将通过总结评论来回答我自己的问题。

首先,感谢@RoelSpilker,如果您明确提供 AllArgs- 和 NoArgs- 构造函数,您可以在一个 Pojo 上同时使用 Builder 和 Data:

 @RequiredArgsConstructor
 @NoArgsConstructor
 @Data
 @Builder
 public class Person {...}

但是:为此类创建的构建器将不知道任何继承的字段。对于我的用例(有一些 AbstractEntities),这使得解决方案毫无用处,我现在将坚持使用手动帮助器/构建器。


0
投票

Lombok文档中写道: Person.builder().name("Adam Savage").city("旧金山").job("流言终结者").job("Unchained Reaction").build();

您是否使用此语法来达到您的目的?根据您的描述,情况并非如此,并且可以解释您收到的错误吗?

© www.soinside.com 2019 - 2024. All rights reserved.