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

xu3bshqb  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(1074)

我发现了IntelliJ IDEA的JPA Buddy插件。在我所有的项目中,我都喜欢使用Lombok。它在我的实体类中节省了很多空间。然而,我刚刚注意到,JPA Buddy突出了它,并建议替换它。
例如:x1c 0d1x
因此,@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。这可能会导致严重的性能和内存消耗问题
但是有人能提供一些真实的世界的例子吗?从我的Angular 来看,@Data也包括了我需要的一切(equals/hashcode)。而且我没有注意到我的项目中有任何性能问题。

e4eetjau

e4eetjau1#

JPA Buddy遵循最佳实践,而@Data for JPA实体是一个反模式......您可以在这里阅读更多内容(包含一些真实世界的示例):https://www.jpa-buddy.com/blog/lombok-and-jpa-what-may-go-wrong/.
简而言之:
1.根据JPA规范,所有实体类都需要具有公共的或受保护的无参数构造函数。@Data只包括@AllArgsConstructor,而不包括@NoArgsConstructor
1.由于Lombok提供的默认@ToString方法实现,您可以轻松加载标记为Lazy的属性,这会显著降低应用的性能。
1.最后,@EqualsAndHashCode实现在某些情况下可能会破坏HashSet(和HashMap)行为。

vfhzx4xs

vfhzx4xs2#

看一下这个blog post,它解释了Lombok在JPA实体类中生成的equals()和hashCode()可能会出现什么问题,以及为什么应该避免

相关问题