我试图弄清楚在注释(让我们以@id为例)getter方法和直接相关字段之间是否存在差异,如果我注释该字段,JPA是否使用某种反射来调用相应的getter?因为在我的情况下,我试图混淆我的实体类,所以我正在寻找一种方法来保留业务逻辑,因为 getter 将被重命名为 aaa() 之类的东西。
2 回答
以下是 JPA2 规范第 2.3.1 节所说的内容:
默认情况下,单一访问类型(字段或属性访问)适用于实体层次结构。实体层次结构的默认访问类型由实体类的属性和未明确指定访问类型的映射超类的映射注释的位置确定。访问类型通过访问注释[6] 明确指定,如第 2.3.2 节所述。当注释用于定义默认访问类型时,映射注释在实体类的持久字段或持久属性上的放置将访问类型分别指定为基于字段或基于属性的访问。
- 当使用基于字段的访问时,实体类的对象/关系映射注解注解实例变量,持久化提供者运行时直接访问实例变量。所有未使用 Transient 注解的非瞬态实例变量都是持久的。
- 当使用基于属性的访问时,实体类的对象/关系映射注解注解 getter 属性访问器[7],持久化提供者运行时通过属性访问器方法访问持久化状态。所有未使用 Transient 注释注释的属性都是持久的。
- 映射注释不得应用于瞬态或瞬态的字段或属性。
以这种方式默认访问类型的实体层次结构中的所有此类类必须在它们在字段或属性上的注释放置方面保持一致,以便在层次结构中应用单个一致的默认访问类型。此类类使用的任何可嵌入类都将具有与层次结构的默认访问类型相同的访问类型,除非按如下定义指定访问注释。如果无法确定默认访问类型并且未通过注释或 XML 描述符显式指定访问类型,则会出现错误。在没有明确指定 Access 注释的情况下,将注释放置在实体层次结构中的字段和属性上混合的应用程序的行为是未定义的。
因此,如果您想避免混淆问题,请始终注释字段而不是 getter,或者使用 @Access 注释强制字段访问类型。
JPA 允许对持久类的数据进行两种类型的访问。字段访问意味着它将实例变量(字段)映射到数据库中的列,而属性访问意味着使用 getter 来确定将映射到数据库的属性名称。它将使用什么访问类型取决于您将 @Id 注释放在哪里(在 id 字段或 getId() 方法上)。