Java имеет transient
ключевое слово. Почему JPA имеет @Transient
вместо того, чтобы просто использовать уже существующее ключевое слово Java?
Java переходный
используется для обозначения того, что поле не должно быть сериализовано, в то время как JPA @Transient
аннотация используется для обозначения того, что поле не должно сохраняться в базе данных, т.е. их семантика отличается.
Потому что у них разные значения. Аннотация @transient
Antotation
говорит поставщику JPA не сохранять любой (не являющийся атрибутом) атрибута ) атрибута
). Другое говорит о структуре сериализации не сериализовать атрибут. Возможно, вы захотите иметь @transient
свойство и все еще сериализуют его.
Как говорили другие, @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, он сохраняет пол
и id
, но не пытается сохранить вспомогательные логические методы - без ] @Transient
базовая система будет жаловаться на то, что в классе Entity Person
отсутствуют методы setMale ()
и setFemale ()
, и поэтому они не сохранятся Человек
вообще.