我正在使用以下内容:
@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吗?
使用 lombok 版本 1.16.18 尝试此代码:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
private String id;
private String firstName;
private String lastName;
}
注意数据对象不是实体!简而言之,hashcode/equals(当考虑 id 字段时)以及实体的延迟加载部分的 toString 方法都存在问题。作为参考,您可以查看Vlad Mihalceas 文章。
你应该:
在确信您的手写或生成的 equals/hashcode 方法没问题之前,请务必至少阅读一些有关 JPA 如何执行“脏检查”的内容。
我将通过总结评论来回答我自己的问题。
首先,感谢@RoelSpilker,如果您明确提供 AllArgs- 和 NoArgs- 构造函数,您可以在一个 Pojo 上同时使用 Builder 和 Data:
@RequiredArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Person {...}
但是:为此类创建的构建器将不知道任何继承的字段。对于我的用例(有一些 AbstractEntities),这使得解决方案毫无用处,我现在将坚持使用手动帮助器/构建器。
Lombok文档中写道: Person.builder().name("Adam Savage").city("旧金山").job("流言终结者").job("Unchained Reaction").build();
您是否使用此语法来达到您的目的?根据您的描述,情况并非如此,并且可以解释您收到的错误吗?