【问题标题】:the difference between anotating a field and its getter method JPA注释字段和它的getter方法JPA之间的区别
【发布时间】:2012-04-17 09:33:43
【问题描述】:

我试图弄清楚在注释(我们以@id 为例)getter 方法和直接相关字段之间是否存在差异,如果我注释该字段,JPA 是否使用某种反射来调用相应的吸气剂? 因为在我的情况下,我试图混淆我的实体类,所以我正在寻找一种方法来保留业务逻辑,因为 getter 将被重命名为 aaa() 之类的东西。

【问题讨论】:

    标签: jpa annotations obfuscation


    【解决方案1】:

    JPA2 规范的第 2.3.1 节是这样说的:

    默认情况下,单一访问类型(字段或属性访问)适用于 实体层次结构。实体层次结构的默认访问类型是 由属性上映射注释的位置决定 实体层次结构的实体类和映射超类 没有明确指定访问类型。访问类型是 通过 Access 注释 [6] 明确指定,如 在第 2.3.2 节中描述。当注释用于定义一个 默认访问类型,映射注释的位置 实体的持久字段或持久属性 class 将访问类型指定为 field- 或 分别基于属性的访问。

    • 使用基于字段的访问时,实体类的对象/关系映射注释会注释实例变量,并且 持久性提供程序运行时直接访问实例变量。 所有未使用注释的非瞬态实例变量 瞬态注释是持久的。
    • 使用基于属性的访问时,实体类的对象/关系映射注解会注解 getter 属性 accessors[7],持久化提供者运行时访问持久化 通过属性访问器方法进行状态。所有属性未注释 带有 Transient 注释的都是持久的。
    • 映射注释不得应用于瞬态或瞬态的字段或属性。

    实体层次结构中所有此类访问类型为 以这种方式默认的必须在它们的位置上保持一致 字段或属性上的注释,例如单个, 一致的默认访问类型适用于层次结构。任何 这些类使用的可嵌入类将具有相同的访问类型 作为层次结构的默认访问类型,除非访问 注释定义如下。如果默认是错误的 无法确定访问类型且访问类型未明确 通过注释或 XML 描述符指定。行为 混合在字段上放置注释的应用程序和 实体层次结构中的属性,无需明确指定 Access 注释未定义。

    因此,如果您想避免混淆问题,请一致地注释字段而不是 getter,或者使用 @Access 注释强制字段访问类型。

    【讨论】:

      【解决方案2】:

      JPA 允许对持久类的数据进行两种类型的访问。字段访问意味着它将实例变量(字段)映射到数据库中的列,而属性访问意味着使用 getter 来确定将映射到数据库的属性名称。它将使用什么访问类型取决于您将 @Id 注释放在哪里(在 id 字段或 getId() 方法上)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-24
        • 2016-09-13
        • 2012-07-21
        • 2011-12-20
        • 2010-10-30
        • 2012-06-25
        • 2015-05-08
        • 1970-01-01
        相关资源
        最近更新 更多