Почему у JPA Transient аннотации есть метод в Target?
Кто-нибудь может объяснить на примере, почему аннотация @Transient в JPA также имеет метод @Target?
Я имею в виду документацию http://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html
@Target (значение ={МЕТОД, ПОЛЯ})
Заранее спасибо!
3 ответа
В сущности JPA вы можете аннотировать поля или методы (геттеры). @Id
аннотация диктует это, то есть если вы положите @Id
на поле, тогда все ваши аннотации должны быть на полях, но если вы, например, включите его, @Id Long getId()
тогда должны следовать другие аннотации. Вот почему @Transient
может быть на метод, а также.
Например, если у вас есть это
@Id
private Long id;
@Transient
private String someTransientField;
private Long getId() {
return this.id;
}
private String getSomeTransientField() {
return this.someTransientField;
}
затем someTransientField
будет рассматриваться как переходный процесс. Но если @Id
останется на поле, и вы двигаетесь @Transient
в private String getSomeTransientField()
затем someTransientField
будет рассматриваться как постоянный, так как @Id
находится на поле, и, следовательно, все остальные аннотации должны быть также на полях.
Так что случай, когда @Transient
будет работать над методом это
private Long id;
private String someTransientField;
@Id
private Long getId() {
return this.id;
}
@Transient
private String getSomeTransientField() {
return this.someTransientField;
}
Это означает, что аннотация может быть использована на Field
или же method
,
Если поле аннотировано, доступ к нему будет получен с помощью отражения.
Если метод (getter) аннотирован, то метод getter будет использоваться для доступа к нему.
@Target
аннотация позволяет определить, где можно использовать эту аннотацию, например, класс, поля, методы и т. д. указывают, какие программные элементы могут быть аннотированы с использованием экземпляров аннотированного типа аннотации.
@Target(value={METHOD,FIELD})
означает, что аннотацию можно использовать только поверх типов (обычно это методы и поля). Вы можете не указывать цель целиком, поэтому аннотацию можно использовать как для классов, так и для полей.
В JPA @Target
- отмечает другую аннотацию @Transient
чтобы ограничить тип java-элементов, к которым может применяться аннотация.