问题
Java有transient
关键字。为什么JPA有@Transient
而不是简单地使用已经存在的java关键字?
#1 热门回答(342 赞)
Java'stransient
关键字用于表示字段不是序列化的,而JPA的@Transient
注释用于表示字段不在数据库中持久存在,即它们的语义不同。
#2 热门回答(98 赞)
因为它们有不同的含义。 @Transient
annotation告诉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时,它仍然存在于gender
和id
但是没有尝试继续帮助布尔方法 - 没有@Transient
底层系统会抱怨实体classPerson
缺少setMale()
和setFemale()
方法,因此不会持久化Person
。