2 回答

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
簡(jiǎn)短回答
為 的字段添加@EqualsAndHashCode.Exclude
注釋。property
PropertySale
長答案
發(fā)生這種情況是因?yàn)椋?/p>
Hibernate 使用的默認(rèn)實(shí)現(xiàn)是,它
Set
HashSet
基于其元素的哈希碼來存儲(chǔ)它們,并且...由于您使用的是 Lombok 的
@Data
注釋,因此哈希碼(以及 equals 和 toString)實(shí)現(xiàn)會(huì)考慮所有類字段。這意味著Property.hashCode()
調(diào)用,反之亦然,導(dǎo)致每當(dāng)調(diào)用它們中的任何一個(gè)時(shí)都會(huì)出現(xiàn)堆棧溢出錯(cuò)誤(如果您調(diào)用或使用這兩個(gè)類中的任何一個(gè),PropertySale.hashCode()
也會(huì)發(fā)生這種情況)。.equals()
.toString()
為了解決這個(gè)問題,您有一些可用的選項(xiàng):
替換
@Data
為@Getter
和@Setter
on class?Property
。由于它不用作 a 內(nèi)的元素Set
,因此它可能?不需要覆蓋hashCode
/equals
,這與PropertySale
.在字段上添加
@EqualsAndHashCode.Exclude
(and )?,因此不會(huì)調(diào)用。@ToString.Exclude
PropertySale.property
PropertySale.hashCode
Property.hashCode
編寫您自己的
hashCode
/equals
實(shí)現(xiàn)PropertySale
(在這種情況下,Lombok 不會(huì)生成它們)而無需調(diào)用(例如,Property.hashCode
您仍然可以使用)。Property.id
獎(jiǎng)金
正如我提到的,可能會(huì)出現(xiàn)同樣的問題,但更正幾乎與/?:?/ 避免/ 自定義實(shí)現(xiàn)toString
相同...equals
hashCode
ToString.Exclude
@Data
您還可以編寫單元測(cè)試,以確保StackOverflowError
在運(yùn)行應(yīng)用程序時(shí)這些方法都不會(huì)拋出異常。

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
快速解決:
更改您的 hashCode 以排除 propertySale。
我在 OneToMany 中遇到了同樣的問題;然后意識(shí)到 HashCode 正在無限循環(huán)。
您只需要更改 hashCode 方法將其排除,即可解決您的問題。
添加回答
舉報(bào)