@Transient注解用于标记JPA实体中不参与数据库映射和持久化的字段或getter方法。它防止JPA为其生成数据库列或执行INSERT/UPDATE操作,适用于临时计算值、前端参数等无对应表字段的场景;可置于字段或getter上(不可同时使用),区别于Java原生transient关键字(仅影响序列化)。

在 JPA 中,用 @Transient 注解标记的字段或 getter 方法,会被 JPA 实体管理器(如 Hibernate)忽略,不参与数据库映射和持久化操作。
什么时候该用 @Transient
当你有一个属性只在运行时需要、但不需要存入数据库时,比如临时计算值、前端传来的校验参数、缓存对象、或与业务逻辑相关但无对应表字段的字段。
- 避免 JPA 尝试为它生成列或执行 INSERT/UPDATE
- 防止因缺少对应数据库字段导致启动失败或运行时报错(如
org.hibernate.MappingException) - 不影响实体其他字段的正常映射和操作
@Transient 放在哪?字段还是方法?
可以加在字段上,也可以加在 getter 方法上(JPA 规范支持两种方式),但二者不能同时存在,否则行为未定义。推荐统一风格,通常放在字段上更直观。
例如:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
@Entity
public class User {
@Id
private Long id;
private String name;
// 不存库,仅运行时使用
@Transient
private String fullName;
// 或者放在 getter 上(效果相同)
// @Transient
// public String getFullName() { ... }
}
注意和 transient 关键字的区别
Java 原生的 transient 关键字只影响序列化(如 JSON 转换、RMI),对 JPA 持久化无效;而 @Transient 是 JPA 的注解,专用于跳过 ORM 映射。
- 字段同时标
transient和@Transient:既不序列化也不持久化 - 只标
transient:仍可能被 JPA 映射(除非有对应列,否则报错) - 只标
@Transient:正常序列化,但不进数据库
常见误用场景
以下情况容易出问题,需特别留意:
- 字段名和数据库列名一致,但没加
@Transient→ JPA 会尝试映射,报“找不到列” - 用了 Lombok 的
@Data或@Getter/@Setter,又在字段上加@Transient→ 有效;但如果只加在 getter 上,Lombok 生成的 getter 可能覆盖你的注解 - 在继承体系中,父类字段加了
@Transient,子类继承后依然生效

















