@Transient 注解使 JPA 忽略字段或 getter,不映射为数据库列、不参与持久化;可标在私有字段(推荐)或 getter 上,与 Java transient 关键字作用不同,仅影响 JPA 映射。

@Transient 注解的作用是告诉 JPA(如 Hibernate)忽略该字段,不将其映射为数据库表中的列,从而阻止它被持久化到数据库。
为什么 @Transient 能阻止持久化
JPA 默认会将实体类中所有非静态、非瞬态(non-transient)的字段视为需要映射的持久化属性。@Transient 显式标记某个字段“不参与持久化”,JPA 提供者在生成建表语句、执行 INSERT/UPDATE 或填充查询结果时都会跳过该字段。
@Transient 的使用位置
它可以标注在字段上,也可以标注在 getter 方法上(两者二选一即可,不要同时标,否则行为可能不一致):
- 标注在字段上(推荐):适用于字段私有、不提供 getter/setter 的场景
- 标注在 getter 方法上:适用于使用 Lombok @Getter/@Setter 或需按访问器控制映射逻辑的情况
常见注意事项
不是所有框架都默认识别 @Transient:确保你用的是标准 JPA 实现(如 Hibernate、EclipseLink),且实体类已正确启用 JPA 扫描;Spring Data JPA 自动支持该注解。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
与 transient 关键字的区别:Java 的 transient 关键字仅影响序列化(如 JSON 或 Java 序列化),对 JPA 持久化无影响;而 @Transient 是 JPA 专属,只影响数据库映射。
不能用于主键或关联字段:如果一个字段本应是 @Id、@ManyToOne 等关系映射字段,加了 @Transient 会导致映射失效甚至启动报错。
简单示例
以下字段不会出现在 user 表中,也不会被插入或查询:
@Entity
public class User {
@Id
private Long id;
private String name;
@Transient
private String tempToken; // 不存库
@Transient
public String getDisplayName() { // 也不存库
return name + "-v2";
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










