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

RaJ*_*RaJ 1 java jpa jpa-2.0

由于实体类字段可以标记为private@Entity访问模式是" 现场 "访问,只是想了解供应商将能够访问在这种情况下,实体状态字段被标记为私有,将不可见的外部类?

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

MWi*_*ner 7

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

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

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

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

•使用基于字段的访问时,实体类的对象/关系映射注释会注释实例变量,而且执行提供程序运行时直接访问实例变量 .所有未使用Transient注释注释的非瞬态实例变量都是持久的.

•当使用基于属性的访问,对于实体类对象/关系映射注解注解吸气属性访问,和持久性提供运行时经由属性访问方法的访问的持久状态.未注释注释的所有属性Transient都是持久的.

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

例如,提供程序Hibernate在其用户指南中给出了以下说明:

2.5.9.访问策略

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

重要说明:

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

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

希望能帮助到你.