解決JPA OneToOne 關係中的延遲載入問題
此查詢涉及由於Hibernate 中的聯接數量過多而導致性能緩慢的應用程序詢問。儘管用 FetchType.LAZY 註解了 @OneToOne 和 @ManyToOne,但延遲載入似乎並沒有生效。
問題根源
問題出在深層實體之間的一對一和多對一關係的層次結構。雖然 ManyToMany 和 OneToMany 關係很容易變得惰性,但對於某些類型的 OneToOne 關聯並非如此。
解
A.可空的一對一關係(無約束)
無約束的一對一一關聯(其中關聯的屬性可以為空)在沒有字節碼檢測的情況下無法代理。這是因為擁有者實體需要知道關聯是否包含代理或 null,這不能僅根據基底表的列來確定。
B.不可為空的一對一關係
對於不可為空的一對一關聯,可以使用以下選項:
將關聯對應為連線關係,新增外鍵列:
@OneToOne(fetch = FetchType.LAZY) @JoinColumn(name="other_entity_fk") public OtherEntity getOther()
C. ManyToOne關係
ManyToOne關係可以無限制地變得惰性:@ManyToOne(fetch=FetchType.LAZY)。但是,請確保此註釋不會在查詢本身中被覆蓋。
注意事項
如果急切載入 OneToOne 關聯會導致嚴重的效能問題,則更廣泛的設計缺陷應該研究資料模型。作為最後的手段,字節碼檢測可能是必要的。
實作說明
以上是為什麼我的 JPA @OneToOne 延遲載入不工作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!