JPA 中 @Access 注解的精确控制:字段访问与属性访问混合模式实战指南-java教程

本文详解 jpa `@access` 注解如何在单个实体中混合使用 `field` 和 `property` 访问策略,通过代码示例、测试验证与关键注意事项,帮助开发者精准控制字段读写时机(如 setter 前置处理),避免默认策略导致的逻辑遗漏。

在 JPA 规范中,实体的访问类型(Access Type)决定了持久化上下文如何读取和写入实体成员——是直接操作字段(AccessType.FIELD),还是通过 getter/setter 方法(AccessType.PROPERTY)。默认情况下,JPA 采用“就近声明决定全局访问类型”规则:若 @Id 注解标注在字段上,则整个实体默认为 FIELD 访问;若标注在 getter 上,则默认为 PROPERTY 访问。但这一全局设定并非不可打破——@Access 注解允许你在特定字段或属性级别显式覆盖默认行为,实现细粒度控制。

以 Student 实体为例:

@Entity
public class Student {
    @Id
    @GeneratedValue
    private Long ID; // ← @Id 在字段 → 默认全局为 FIELD

    private String firstName; // ← 未加 @Access → 按默认 FIELD 访问:绕过 setter/getter

    @Access(AccessType.PROPERTY) // ← 显式声明:lastName 必须走 getter/setter
    private String lastName;

    // ... getter/setter(注意:getlastName() 是笔误,应为 getLastName())
    public String getFirstName() {
        System.out.println("~~~~~~~~getFirstName~~~~~~~~~");
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = "FirstName: " + firstName; // ← 此逻辑在 FIELD 模式下*不会被调用*
        System.out.println("~~~~~~~~setFirstName~~~~~~~~~");
    }

    public String getLastName() { // 修正方法名
        System.out.println("~~~~~~~~getLastName~~~~~~~~~");
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = "LastName: " + lastName; // ← 此逻辑在 PROPERTY 模式下*会被调用*
        System.out.println("~~~~~~~~setLastName~~~~~~~~~");
    }
}

关键点在于:
✅ firstName 使用默认 FIELD 访问 → JPA 直接读写字段值,完全跳过 setFirstName() 和 getFirstName() 方法;
✅ lastName 受 @Access(AccessType.PROPERTY) 控制 → JPA 强制通过 setLastName() 初始化、通过 getLastName() 读取,确保前置/后置逻辑生效。

为实证该行为,可编写如下集成测试(需配置内存数据库如 H2):

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » JPA 中 @Access 注解的精确控制:字段访问与属性访问混合模式实战指南-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4023164+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4023164+
  • 本周更新: 0+
  • 最后更新: 2026-03-16