繁体   English   中英

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

[英]How does a JPA provider access (private) field values when no getter/setter method are defined?

由于在@Entity访问模式为“ 字段 ”访问时,可以将实体类字段标记为private ,所以只是想了解在这种情况下,当字段被标记为“私有”并且在类外部不可见时,提供者将如何访问实体状态?

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

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

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

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

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

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

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

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

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

2.5.9。 访问策略

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

重要说明

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

所有这些类在实体层级,其访问类型以这种方式被默认必须在其上的字段属性 ,例如,一个单一的,一致的默认访问类型适用于层次结构中注释的位置一致。

希望能帮助到你。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM