Почему аннотация JPA Transient имеет метод в Target?

Может ли кто-нибудь объяснить на примере, почему аннотация @Transient в JPA также имеет @Target method?

Я имею в виду документацию http://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html

@Target(значение={МЕТОД,ПОЛЕ})

Заранее спасибо!


person user2906555    schedule 26.07.2016    source источник
comment
вы можете получить доступ к переходному атрибуту с помощью метода или поля геттера, поэтому он имеет   -  person Saravana    schedule 26.07.2016
comment
Какой смысл разрешать это в методах? разрешения только на поля не должно быть достаточно?   -  person user2906555    schedule 26.07.2016
comment
нет, вы можете запрограммировать доступ к полю, используя методы отражения или получения.   -  person Saravana    schedule 26.07.2016
comment
Это не имеет ничего общего с JPA и просто базовыми аннотациями Java.   -  person Neil Stockton    schedule 26.07.2016


Ответы (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;
}
person Predrag Maric    schedule 26.07.2016
comment
Можете ли вы помочь с примером, где @Transient больше подходит для использования в методе, а не в поле? - person user2906555; 27.07.2016

Аннотация @Target позволяет определить, где можно использовать эту аннотацию, например, класс, поля, методы и т. д. указывают, какие элементы программы могут быть аннотированы с использованием экземпляров аннотированного типа.

@Target(value={METHOD,FIELD}) означает, что аннотацию можно использовать только поверх типов (как правило, методов и полей). Вы можете не указывать цель целиком, чтобы аннотацию можно было использовать как для классов, методов, так и для полей.

В JPA @Target — помечает другую аннотацию @Transient, чтобы ограничить, к каким элементам Java может применяться аннотация.

person Mihir    schedule 26.07.2016

Это означает, что аннотацию можно использовать на Field или method.

Если поле аннотировано, доступ к полю будет осуществляться с помощью отражения.

Если метод (геттер) аннотирован, то для доступа к нему будет использоваться метод геттера.

person Saravana    schedule 26.07.2016