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

在 JPA 中,用 @Transient 注解标记的字段或 getter 方法,会被 JPA 实体管理器(如 Hibernate)忽略,不参与数据库映射和持久化操作。
什么时候该用 @Transient
当你有一个属性只在运行时需要、但不需要存入数据库时,比如临时计算值、前端传来的校验参数、缓存对象、或与业务逻辑相关但无对应表字段的字段。
- 避免 JPA 尝试为它生成列或执行 INSERT/UPDATE
- 防止因缺少对应数据库字段导致启动失败或运行时报错(如
org.hibernate.MappingException) - 不影响实体其他字段的正常映射和操作
@Transient 放在哪?字段还是方法?
可以加在字段上,也可以加在 getter 方法上(JPA 规范支持两种方式),但二者不能同时存在,否则行为未定义。推荐统一风格,通常放在字段上更直观。
例如:
@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,子类继承后依然生效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











