Hvorfor har JPA en @Transient annotation?
Javas transient
nøgleord bruges til at angive, at et felt ikke skal serialiseres, hvorimod JPA's @Transient
annotation bruges til at angive, at et felt ikke skal bestå i databasen, dvs. deres semantik er forskellig.
Fordi de har forskellige betydninger. @Transient
annotation fortæller JPA-udbyderen om ikke at fortsætte nogen (ikke-transient
) attribut. Den anden fortæller serialiseringsrammen ikke at serialisere en attribut. Du vil måske have en @Transient
ejendom og stadig serialisere den.
Som andre har sagt, @Transient
bruges til at markere felter, som ikke bør bevares. Overvej dette korte eksempel:
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);
}
}
Når denne klasse sendes til JPA, bevarer den gender
og id
men forsøger ikke at fortsætte de booleske hjælpemetoder - uden @Transient
det underliggende system ville klage over, at enhedsklassen Person
mangler setMale()
og setFemale()
metoder og ville derfor ikke bestå Person
overhovedet.