当没有定义getter / setter方法时,JPA提供程序如何访问(私有)字段值?

时间:2016-06-23 21:42:35

标签: java jpa jpa-2.0

private访问模式为" 字段"时,实体类字段可以标记为@Entity访问,只是想了解提供商在这种情况下如何能够访问实体状态,因为字段被标记为私有,并且在类外不可见?

编辑#1 - 如您所知,对于字段访问,getter和setter方法是可选的。所以我想了解提供程序在没有提供getter / setter方法时如何访问该字段。希望这能澄清我的问题。

2 个答案:

答案 0 :(得分:7)

参考第2.2节(第24页)中的官方JPA specification(最终版本,JPA 2.1),我们发现:

  

持久性提供程序运行时通过JavaBeans访问实体的持久状态   样式属性访问器(“属性访问”)或通过实例变量(“字段访问”)。是否执着   属性或持久字段或两者的组合用于提供者对a的访问   给定的类或实体层次结构的确定如第2.3节“访问类型”中所述。

在第2.3.1节(第27页)中,对于您的问题,这个定义更加具体:

  

默认情况下,单个访问类型(字段或属性访问)适用于实体层次结构。默认   实体层次结构的访问类型由映射注释的放置决定   实体类的属性和未明确的实体层次结构的映射超类   指定访问类型。 [...]

     

•使用基于字段的访问时,实体类的对象/关系映射注释   注释实例变量,p ersistence provider runtime 访问实例变量   的直接即可。所有未使用Transient注释的非瞬态实例变量   注释是持久的。

     

•使用基于属性的访问时,实体的对象/关系映射注释   class注释getter属性访问器,持久性提供程序运行时通过属性访问器方法访问持久状态。未使用Transient注释注释的所有属性都是持久的。

术语直接是指一种访问策略,它允许操作对象的字段(值),而无需使用getter / setter方法。在Java和大多数OR-mappers(至少是我所知道的)中,这是通过Introspection - 使用Java Reflection API实现的。这样,可以检查和操作类的字段以保存/表示来自(关系)数据库条目(即它们各自的列)的数据值。

例如,提供商 Hibernate 在其User Guide中提供了以下说明:

  

2.5.9。访问策略

     

作为JPA提供者,Hibernate可以自省两个实体属性   (实例字段)或访问者(实例属性)。默认情况下,   @Id注释的位置提供了默认的访问策略。

重要提示

尝试不同的访问策略时要小心!必须遵守以下要求(JPA规范,第28页):

  

以这种方式默认访问类型的实体层次结构中的所有此类必须保持一致   他们在 字段属性上放置注释,以便实现单一,一致的默认访问   类型适用于层次结构。

希望它有所帮助。

答案 1 :(得分:2)

提供程序可以使用反射来访问类实例上的私有字段。