2 回答
TA贡献1844条经验 获得超8个赞
简短回答
为 的字段添加@EqualsAndHashCode.Exclude
注释。property
PropertySale
长答案
发生这种情况是因为:
Hibernate 使用的默认实现是,它
Set
HashSet
基于其元素的哈希码来存储它们,并且...由于您使用的是 Lombok 的
@Data
注释,因此哈希码(以及 equals 和 toString)实现会考虑所有类字段。这意味着Property.hashCode()
调用,反之亦然,导致每当调用它们中的任何一个时都会出现堆栈溢出错误(如果您调用或使用这两个类中的任何一个,PropertySale.hashCode()
也会发生这种情况)。.equals()
.toString()
为了解决这个问题,您有一些可用的选项:
替换
@Data
为@Getter
和@Setter
on classProperty
。由于它不用作 a 内的元素Set
,因此它可能 不需要覆盖hashCode
/equals
,这与PropertySale
.在字段上添加
@EqualsAndHashCode.Exclude
(and ) ,因此不会调用。@ToString.Exclude
PropertySale.property
PropertySale.hashCode
Property.hashCode
编写您自己的
hashCode
/equals
实现PropertySale
(在这种情况下,Lombok 不会生成它们)而无需调用(例如,Property.hashCode
您仍然可以使用)。Property.id
奖金
正如我提到的,可能会出现同样的问题,但更正几乎与/ : / 避免/ 自定义实现toString
相同...equals
hashCode
ToString.Exclude
@Data
您还可以编写单元测试,以确保StackOverflowError
在运行应用程序时这些方法都不会抛出异常。
TA贡献1793条经验 获得超6个赞
快速解决:
更改您的 hashCode 以排除 propertySale。
我在 OneToMany 中遇到了同样的问题;然后意识到 HashCode 正在无限循环。
您只需要更改 hashCode 方法将其排除,即可解决您的问题。
添加回答
举报