我使用以下内容:
@Entity
@Data
@Builder
@NoArgsConstructor(force = true)
public class User {
private String id;
private String firstName;
private String lastName;
}
我想要实现的目标:对于JPA用法,我需要一个带有noArgConstructor,getters / setter和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
创建新实体时发生错误...构建器()正常工作。
我想念什么?是不是可以同时使用@ Data,@ Entity和@Builder?
答案 0 :(得分:10)
使用lombok版本1.16.18尝试此代码:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
private String id;
private String firstName;
private String lastName;
}
答案 1 :(得分:1)
在Lombok文档中写道: Person.builder()。name(“Adam Savage”)。city(“San Francisco”)。job(“Mythbusters”)。job(“Unchained Reaction”)。build();
您是否将此语法用于您的目的?根据你的描述,情况并非如此,并且可以解释你得到的错误?
答案 2 :(得分:1)
当心data objects aren't entities!简而言之,哈希码/等式(当它考虑id字段时)以及实体的延迟加载部分的toString方法都存在问题。作为参考,您可以检查Vlad Mihalceas article。
您应该:
在确信自己的手写或生成的equals / hashcode方法是可以的之前,请务必至少阅读有关JPA如何执行“ dirty checking”主题的内容。
答案 3 :(得分:0)
我将通过总结评论来回答我自己的问题。
首先,感谢@RoelSpilker,如果明确提供AllArgs-和NoArgs-构造函数,则可以在一个Pojo上同时使用Builder和Data:
@RequiredArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Person {...}
但是:为此类创建的构建器不会知道任何继承的字段。对于我的用例(有一些AbstractEntities),这使得解决方案无用,我现在将坚持使用手动助手/构建器。