在我們調用ManyToOne
註釋字段的getter方法時,持久性提供程序(如EclipseLink或Hibernate)使用find()
或getReference()
加載實體?JPA @ManyToOne - EntityNotFoundException或空值?
find()
回報null
如果EntityNotFound
getReference()
拋出EntityNotFoundException
那麼應該怎麼幹將的情況下做實體是沒有發現?
在我們調用ManyToOne
註釋字段的getter方法時,持久性提供程序(如EclipseLink或Hibernate)使用find()
或getReference()
加載實體?JPA @ManyToOne - EntityNotFoundException或空值?
find()
回報null
如果EntityNotFound
getReference()
拋出EntityNotFoundException
那麼應該怎麼幹將的情況下做實體是沒有發現?
引擎蓋下的持久性提供類似的EclipseLink或休眠
uses find() or getReference()
加載實體時,我們稱之爲多對一註釋字段的getter方法?
Hibernate不打電話找到或getRefernce幕後。這些方法用於客戶端定位實體或代理。
如果你有一個@ManyToOne
關聯,Hibernate已經知道如何獲取父實體,因爲在幕後,JPA @ManyToOne
只是一個外鍵。
但是當您瀏覽關聯時,Hibernate已經知道FK的值,因爲加載子實體的原始ResultSet
也包含FK的值。
然而,這不是強制休眠去DB因爲裝載週期如下:
因此,實際上,當我們導航FK時不需要EntityNotFoundException
,因爲孩子無法引用不存在的父記錄。如果你沒有使用FK,並且你的數據庫中存在這樣的不一致性,那麼Hibernate確實會拋出一個異常。但那會告訴你,你的數據建模設計可能已經失效。
感謝indees的答案!我在我的一個項目中使用EclipseLink,並且沒有強制執行FK costraint,並且當我在ManyToOne關聯上調用getMyEntity時,我只是獲得一個空值。這與JPA規範是否一致? – GionJh
您應該詢問EclipseLink團隊。我不認爲JPA規定了導航一個不存在的關聯的標準結果。 –
非常感謝弗拉德! – GionJh