为什么 JPA Buddy 抱怨 JPA 实体上的 @Data 注释?

问题描述 投票:0回答:2

我发现了 IntelliJ IDEA 的 JPA Buddy 插件。在我所有的项目中,我喜欢使用 Lombok。它在我的实体类中节省了大量空间。然而,我刚刚注意到,JPA Buddy 强调了它并建议更换。

例如:

因此,@Data 注解被替换为:

@Getter
@Setter
@ToString
@RequiredArgsConstructor
  • 添加了 hashCode 和 equals 实现:
@Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) {
            return false;
        }
        Project project = (Project) o;
        return id != null && Objects.equals(id, project.id);
    }

    @Override
    public int hashCode() {
        return getClass().hashCode();
    }

我清楚地看到描述: 不建议对 JPA 实体使用 @Data。它可能会导致严重的性能和内存消耗问题

但是有人可以提供一些现实世界的例子吗?从我的角度来看,@Data 也包含我需要的一切(等于/哈希码)。我没有注意到我的项目有任何性能问题。

hibernate jpa intellij-idea lombok jpa-buddy
2个回答
13
投票

JPA Buddy 遵循最佳实践,而 JPA 实体的 @Data 是一种反模式...... 您可以在这里阅读更多信息(带有一些现实世界的示例):https://jpa-buddy.com/blog/lombok-and-jpa-what-may-go-wrong/.

简而言之:

  1. 根据JPA规范,所有实体类都必须有一个公共或受保护的无参构造函数。
    @Data
    仅包括
    @AllArgsConstructor
    ,不包括
    @NoArgsConstructor
  2. 您可以轻松加载由于 Lombok 提供的默认
    @ToString
    方法实现而标记为 Lazy 的属性 - 这会显着降低应用程序的性能。
  3. 最后,
    @EqualsAndHashCode
    的实现可以在某些条件下破坏HashSet(和HashMap)行为。

5
投票

看看这篇博客文章,它解释了 Lombok 在 JPA 实体类中生成的 equals() 和 hashCode() 可能会出现什么问题以及为什么应该避免它

© www.soinside.com 2019 - 2024. All rights reserved.