【问题标题】:How does a JPA provider access (private) field values when no getter/setter method are defined?当没有定义 getter/setter 方法时,JPA 提供者如何访问(私有)字段值?
【发布时间】:2016-06-23 21:42:35
【问题描述】:

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

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

【问题讨论】:

  • 不是重复的。我已经编辑了我的问题以进行澄清。
  • 好的,我已经删除了我的标志!

标签: java jpa jpa-2.0


【解决方案1】:

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

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

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

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

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

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

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

例如,提供商 Hibernate 在其User Guide 中给出了以下解释:

2.5.9。访问策略

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

重要提示

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

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多