2012-04-17 62 views
3

我試圖找出它們之間的區別anotating(讓我們以@id爲例)getter方法和直接關注的字段,以防我註釋字段JPA使用某種反射來調用相應的getter? ,因爲在我的情況下,我試圖混淆我的實體類,所以我正在尋找一種方法來保持業務邏輯,因爲getter將被重命名爲類似aaa()的東西。anotating一個字段和它的getter方法之間的區別JPA

回答

7

下面介紹一下JPA2規範的第2.3.1節說:

默認情況下,單一的接入類型(字段或屬性訪問)適用於 實體層次。實體層次結構的默認訪問類型爲 ,其取決於實體類的屬性 上的映射註釋的放置位置,以及未明確指定訪問類型的實體層次結構 的映射超類。訪問類型爲 ,通過訪問註釋[6]明確指定,如第2.3.2節中所述的 。當使用註釋來定義默認訪問類型時,映射註釋在 上的位置(實體 類的持久字段或持久性屬性)將訪問類型指定爲字段或 ,分別爲基於屬性的訪問。

  • 當使用基於字段的訪問,對於實體類對象/關係映射註解註釋實例變量,和 持久性提供運行時直接訪問的實例變量。 所有非暫時性實例變量未用 暫態註釋進行註釋都是持久性的。
  • 使用基於屬性的訪問時,實體類的對象/關係映射註釋通過屬性訪問器方法註釋獲取器屬性 訪問器[7],並且持久性提供程序運行時訪問持久性 狀態。所有不帶註釋的屬性 都是持久性的。
  • 映射註釋不得應用於瞬態或瞬態的字段或屬性。

所有這些類在實體層級,其訪問類型是 默認這種方式必須是在他們對字段或屬性,例如,一個單一的, 一致的默認接入類型應用中的 註釋位置一致層次結構。任何 這些類使用的可嵌入類將具有與層次結構的默認訪問類型相同的訪問類型 ,除非按照以下定義指定訪問 註釋。如果無法確定默認的訪問類型,並且訪問類型不是通過註釋或XML描述符指定的訪問類型明確爲 ,則會出錯。沒有明確指定 Access實體層次結構中的字段和 屬性的應用程序的行爲 未定義。

所以,如果你想避免混淆問題,那麼一致地註釋字段而不是getters,或者使用@Access註解來強制字段訪問類型。

5

JPA允許對持久類的數據進行兩種類型的訪問。字段訪問意味着它將實例變量(字段)映射到數據庫和屬性訪問中的列,這意味着它使用獲取器來確定將映射到數據庫的屬性名稱。使用哪種訪問類型取決於你在何處放置@Id註釋(在ID字段或getId()方法上)。