最常用、最标准的方式是使用 @transient 注解(来自 javax.persistence.transient),它明确告知 jpa 忽略该字段的持久化,不生成数据库列,也不参与 insert/update 操作,适用于 @entity 类中任意字段。

在 Java 中使用 JPA(如 Hibernate)操作 MySQL 数据库时,若想让某个字段不被持久化到数据库,最常用、最标准的方式就是使用 @Transient 注解。
使用 @Transient 标记临时字段
该注解来自 javax.persistence.Transient(JPA 标准),表示该字段不参与 JPA 的 ORM 映射,不会生成对应数据库列,也不会在 INSERT/UPDATE 时被处理。
- 适用于实体类(
@Entity标注的类)中的任意字段(包括基本类型、包装类、自定义对象等) - 无需额外配置,加在字段或 getter 方法上均可(推荐加在字段上,更直观)
- 注意:它只影响 JPA 行为,不影响序列化(如 JSON 转换),如需同时忽略 JSON 序列化,需额外加
@JsonIgnore或@Transient(Jackson 的)
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Entity
public class User {
@Id
private Long id;
private String name;
// 不存入数据库,也不参与 JPA 操作
@Transient
private String tempToken;
// 也可加在 getter 上(效果相同)
private Integer score;
@Transient
public Integer getScore() {
return score;
}
}
其他可选方式(按场景区分)
某些情况下,@Transient 不够用,可考虑以下替代方案:
- @Column(insertable = false, updatable = false):字段仍映射到某列,但禁止插入和更新(适合只读视图字段,且数据库中已存在对应列)
- 不加任何 JPA 注解 + 私有字段 + 无 getter/setter:JPA 默认只处理有 public getter/setter 或显式标注的字段;若字段完全不暴露,JPA 会自动忽略(但可维护性差,不推荐)
-
@JsonIgnore(Jackson):仅控制 JSON 序列化/反序列化,与数据库无关;常和
@Transient配合使用,避免临时字段出现在 API 响应中
常见误区提醒
避免混淆几个名字相似但作用不同的注解:
-
java.beans.Transient:用于 JavaBeans 序列化(如ObjectOutputStream),对 JPA 无效 -
org.springframework.data.annotation.Transient:Spring Data Commons 提供,主要用在非 JPA 场景(如 MongoDB),在 JPA 环境下不生效 - 字段用
static或final修饰:JPA 默认忽略 static 字段;final 字段若无 setter,也可能被跳过,但属于隐式行为,不可靠,不建议依赖
验证是否生效的小技巧
启动应用时开启 Hibernate SQL 日志(如配置 spring.jpa.show-sql=true 和 spring.jpa.properties.hibernate.format_sql=true),观察 INSERT/UPDATE 语句是否包含该字段。若未出现,说明屏蔽成功。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










