我发现了 IntelliJ IDEA 的 JPA Buddy 插件。在我所有的项目中,我喜欢使用 Lombok。它在我的实体类中节省了大量空间。然而,我刚刚注意到,JPA Buddy 强调了它并建议更换。
因此,@Data 注解被替换为:
@Getter
@Setter
@ToString
@RequiredArgsConstructor
@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 也包含我需要的一切(等于/哈希码)。我没有注意到我的项目有任何性能问题。
JPA Buddy 遵循最佳实践,而 JPA 实体的 @Data 是一种反模式...... 您可以在这里阅读更多信息(带有一些现实世界的示例):https://jpa-buddy.com/blog/lombok-and-jpa-what-may-go-wrong/.
简而言之:
@Data
仅包括 @AllArgsConstructor
,不包括 @NoArgsConstructor
@ToString
方法实现而标记为 Lazy 的属性 - 这会显着降低应用程序的性能。@EqualsAndHashCode
的实现可以在某些条件下破坏HashSet(和HashMap)行为。看看这篇博客文章,它解释了 Lombok 在 JPA 实体类中生成的 equals() 和 hashCode() 可能会出现什么问题以及为什么应该避免它