在实体上使用 lomboks @Data 和 @Builder
Using lomboks @Data and @Builder on entity
我正在使用以下内容:
@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 文档中写道:
Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
您是否将此语法用于您的目的?根据您的描述,情况并非如此,能否解释您得到的错误?
我会通过汇总评论来回答我自己的问题。
首先,感谢@RoelSpilker,如果您明确提供 AllArgs- 和 NoArgs- 构造函数,您可以在一个 Pojo 上同时使用 Builder 和 Data:
@RequiredArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Person {...}
但是:为此 class 创建的构建器将不知道任何继承的字段。对于我的用例(有一些 AbstractEntities),这使得解决方案毫无用处,我现在将坚持使用手册 helpers/builders。
在 lombok 版本 1.16.18 以上尝试此代码:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
private String id;
private String firstName;
private String lastName;
}
当心data objects aren't entities! Simply put, there is problem with hashcode/equals (when it considers id fields) and also toString method with lazy loaded parts of entity. For reference you can check Vlad Mihalceas article。
你应该:
- 从 hashcode/equals
中排除 ID 字段
- 从 hashcode/equals
中排除未在给定实体中管理的关联字段
- 从 toString 方法中排除所有延迟加载的字段
- 从 toString 方法中排除可能导致循环引用的字段
在确信您的手写或生成的 equals/hashcode 方法没问题之前,请务必至少阅读有关 JPA 如何执行“dirty checking”的主题。
我正在使用以下内容:
@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 文档中写道: Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
您是否将此语法用于您的目的?根据您的描述,情况并非如此,能否解释您得到的错误?
我会通过汇总评论来回答我自己的问题。
首先,感谢@RoelSpilker,如果您明确提供 AllArgs- 和 NoArgs- 构造函数,您可以在一个 Pojo 上同时使用 Builder 和 Data:
@RequiredArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Person {...}
但是:为此 class 创建的构建器将不知道任何继承的字段。对于我的用例(有一些 AbstractEntities),这使得解决方案毫无用处,我现在将坚持使用手册 helpers/builders。
在 lombok 版本 1.16.18 以上尝试此代码:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
private String id;
private String firstName;
private String lastName;
}
当心data objects aren't entities! Simply put, there is problem with hashcode/equals (when it considers id fields) and also toString method with lazy loaded parts of entity. For reference you can check Vlad Mihalceas article。
你应该:
- 从 hashcode/equals 中排除 ID 字段
- 从 hashcode/equals 中排除未在给定实体中管理的关联字段
- 从 toString 方法中排除所有延迟加载的字段
- 从 toString 方法中排除可能导致循环引用的字段
在确信您的手写或生成的 equals/hashcode 方法没问题之前,请务必至少阅读有关 JPA 如何执行“dirty checking”的主题。