为什么JPA有@Transient注释?

问题

Java有transient关键字。为什么JPA有@Transient而不是简单地使用已经存在的java关键字?


#1 热门回答(342 赞)

Java'stransient关键字用于表示字段不是序列化的,而JPA的@Transient注释用于表示字段不在数据库中持久存在,即它们的语义不同。


#2 热门回答(98 赞)

因为它们有不同的含义。 @Transientannotation告诉JPA提供程序不保留任何(非transient)属性。另一个告诉序列化框架不要序列化属性。你可能希望拥有a@Transient属性并仍然序列化它。


#3 热门回答(75 赞)

正如其他人所说,@Transient用于标记不应该持久化的字段。考虑这个简短的例子:

public enum Gender { MALE, FEMALE, UNKNOWN }

@Entity
public Person {
    private Gender g;
    private long id;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public long getId() { return id; }
    public void setId(long id) { this.id = id; }

    public Gender getGender() { return g; }    
    public void setGender(Gender g) { this.g = g; }

    @Transient
    public boolean isMale() {
        return Gender.MALE.equals(g);
    }

    @Transient
    public boolean isFemale() {
        return Gender.FEMALE.equals(g);
    }
}

当这个类被提供给JPA时,它仍然存在于genderid但是没有尝试继续帮助布尔方法 - 没有@Transient底层系统会抱怨实体classPerson缺少setMale()setFemale()方法,因此不会持久化Person