亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

休眠中的自引用實體導致 StackOverflowErrors

休眠中的自引用實體導致 StackOverflowErrors

牛魔王的故事 2021-07-17 18:05:57
在我的一個 Java 實體 (MyState) 中,我有一個對自身的引用。注釋如下所示:@OneToOne @JoinColumn(name = "previousStateId", nullable = true,         foreignKey = @ForeignKey(name = "fk_state_previousstate"))private MyState previousState;這曾經工作得很好,直到表格變大并且越來越多的狀態相互指向。現在,當我嘗試獲取最新的 MyState 時,會發生 StackOverflowError,因為嵌套太深。有什么比這里更好的網站來問我的問題?;-)我最終需要訪問根狀態(一長串狀態中的第一個狀態),以及前一個狀態。有什么辦法可以避免獲得所有參考資料?我試圖添加一個指向原始狀態的新字段“rootState”。這當然是 2 個狀態的短鏈,所以效果很好。但是,我確實也需要以前的狀態。我應該嘗試通過將 previousState 的 previousState 設置為 null 來手動中斷鏈,還是有更好的選擇?
查看完整描述

2 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

顯然這是一個錯誤。如果您有一個實體 Person 并且該實體具有對另一個 Person 的嵌套引用,則意味著嵌套的 Person 具有另一個嵌套鏈接,因此它會執行子嵌套鏈接,依此類推。您不必使用 Person 對象引用嵌套的 Person。改用唯一的 id。


public class Person{

    private int idNestedPerson;

    //fields + getters/setters

}

現在您有 2 個選擇:使用外鍵或保持原樣。如果您選擇第一個選項,您必須映射該nestedId,但我建議您開始使用第二個選項。這樣你就有一個帶有引用“父親”人的 id 的人。如果該 nestedId 為 != null OR > 0(根據您分配給 id 的類型),則表示 Person 是嵌套的,如果未填充 id 或 id 的默認 int 值為 0,則表示 Person是一個“根”,所以不是嵌套的。有關詳細信息,請參閱“分層數據”。


查看完整回答
反對 回復 2021-07-22
?
www說

TA貢獻1775條經驗 獲得超8個贊

這應該有效,直到您有循環依賴。對于循環依賴,StackOverflowError 可能會因為無限循環遞歸獲取先前狀態而發生。

例如,當你有兩個實體 A 和 B。A 指向 B 而 B 指向 A 那么你有無限循環,并且使用 EAGER 獲取策略你最終會得到 StackOverflowError。

您需要檢查您在 DB 中是否沒有任何循環依賴。


查看完整回答
反對 回復 2021-07-22
  • 2 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號