在实体上使用龙目岛@Data和@Builder

2022-09-03 05:04:06

我正在使用以下内容:

@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与RequinedFieldsConstructor似乎存在问题:

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

更新:当我尝试通过新...构建器() 工作。

我错过了什么?难道不能同时使用@Data、@Entity和@Builder吗?


答案 1

试试这个代码与龙目岛版本 1.16.18 在 :

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

答案 2

请注意,数据对象不是实体!简单地说,哈希码/等于(当它考虑id字段时)以及具有延迟加载实体部分的string方法存在问题。作为参考,您可以查看Vlad Mihalceas文章

您应该:

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

当然,在确信你的手写或生成的等于/哈希码方法是可以的之前,至少要阅读一些关于JPA如何进行“脏检查”的主题。


推荐