我发现了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)。而且我没有注意到我的项目中有任何性能问题。
2条答案
按热度按时间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)行为。
vfhzx4xs2#
看一下这个blog post,它解释了Lombok在JPA实体类中生成的equals()和hashCode()可能会出现什么问题,以及为什么应该避免