在实体

时间:2016-11-09 21:08:50

标签: java lombok

我使用以下内容:

@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?

4 个答案:

答案 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

您应该:

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

在确信自己的手写或生成的equals / hashcode方法是可以的之前,请务必至少阅读有关JPA如何执行“ dirty checking”主题的内容。

答案 3 :(得分:0)

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

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

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

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