2017-04-04 71 views
1

在我們調用ManyToOne註釋字段的getter方法時,持久性提供程序(如EclipseLink或Hibernate)使用find()getReference()加載實體?JPA @ManyToOne - EntityNotFoundException或空值?

find()回報null如果EntityNotFound

getReference()拋出EntityNotFoundException

那麼應該怎麼幹將的情況下做實體是沒有發現?

回答

0

引擎蓋下的持久性提供類似的EclipseLink或休眠

uses find() or getReference() 

加載實體時,我們稱之爲多對一註釋字段的getter方法?

Hibernate不打電話找到或getRefernce幕後。這些方法用於客戶端定位實體或代理。

如果你有一個@ManyToOne關聯,Hibernate已經知道如何獲取父實體,因爲在幕後,JPA @ManyToOne只是一個外鍵。

但是當您瀏覽關聯時,Hibernate已經知道FK的值,因爲加載子實體的原始ResultSet也包含FK的值。

然而,這不是強制休眠去DB因爲裝載週期如下:

  1. 一級緩存中查找,您需要
  2. 實體如果發現什麼在第一級高速緩存中,Hibernate嘗試將其定位在第二級高速緩存中
  3. 如果實體仍未找到,則會發出輔助查詢,因爲該關聯必須是LAZY。

因此,實際上,當我們導航FK時不需要EntityNotFoundException,因爲孩子無法引用不存在的父記錄。如果你沒有使用FK,並且你的數據庫中存在這樣的不一致性,那麼Hibernate確實會拋出一個異常。但那會告訴你,你的數據建模設計可能已經失效。

+0

感謝indees的答案!我在我的一個項目中使用EclipseLink,並且沒有強制執行FK costraint,並且當我在ManyToOne關聯上調用getMyEntity時,我只是獲得一個空值。這與JPA規範是否一致? – GionJh

+0

您應該詢問EclipseLink團隊。我不認爲JPA規定了導航一個不存在的關聯的標準結果。 –

+0

非常感謝弗拉德! – GionJh

相關問題