Почему у 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-элементов, к которым может применяться аннотация.

Другие вопросы по тегам