Hibernate中@Transient 介绍一下

259 阅读2分钟

@Transient 是编程中一个常见的注解(Annotation)或关键字,主要用于标记某些属性或字段在对象序列化时应被忽略。以下是其在不同编程语言中的具体含义和用法:

1. Java 中的 @Transient

在 Java 中,@Transient 是一个标记注解(无参数),用于指示某个字段在对象序列化时不被持久化。

作用

  • 序列化忽略:当对象被序列化(如写入文件、通过网络传输)时,被 @Transient 标记的字段不会被包含在内。
  • 临时数据:常用于标记不需要持久化的临时变量、计算结果或敏感信息(如密码)。

示例

java

import java.io.Serializable;

public class User implements Serializable {
    private String username;  // 会被序列化
    @Transient private String password;  // 不会被序列化
    @Transient private transient int tempCounter;  // 双重忽略(Java 中 @Transient 和 transient 关键字效果相同)
    
    // getters and setters
}

注意事项

  • 与 transient 关键字的关系:Java 中 @Transient(注解)和 transient(关键字)效果相同,但场景略有不同:

    • transient 是 Java 语言内置的关键字。
    • @Transient 是 JPA(Java Persistence API)或其他框架提供的注解,用于 ORM(对象关系映射)场景。

2. Spring Data JPA 中的 @Transient

在 Spring Data JPA 中,@Transient 用于标记实体类中不需要映射到数据库的字段。

作用

  • 数据库忽略:被标记的字段不会对应数据库中的任何列。
  • 计算字段:常用于存储从其他字段计算而来的值,或与业务逻辑相关但无需持久化的数据。

示例

java

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class Product {
    @Id
    private Long id;
    private double price;
    private int quantity;
    
    @Transient
    private double totalPrice;  // 计算字段,不映射到数据库
    
    // 计算方法
    public double getTotalPrice() {
        return price * quantity;
    }
}

3. Kotlin 中的 @Transient

在 Kotlin 中,可通过 Java 互操作性使用 @Transient,或使用 transient 关键字。

示例

kotlin

import java.io.Serializable

class User : Serializable {
    var username: String = ""
    @Transient var password: String = ""  // 使用注解
    @kotlin.Transient var tempData: String = ""  // 使用 Kotlin 注解
}

4. 其他框架中的类似注解

  • Hibernate:使用 @Transient 标记不需要持久化的字段。
  • Jackson:使用 @JsonIgnore 或 @JsonTransient 忽略 JSON 序列化中的字段。
  • Python(Django) :使用 @property 装饰器创建计算属性,不会存储到数据库。

总结

@Transient 的核心作用是在序列化或持久化过程中忽略特定字段,常见于:

  • 避免敏感信息(如密码)被存储或传输。

  • 排除临时数据或计算结果,减少存储空间或传输带宽。

  • 分离业务逻辑和持久化逻辑,提高代码的可维护性。

使用时需注意不同框架或语言对该注解的具体实现可能略有差异。