В Java поле определяется как атрибут экземпляра. Свойство — это любое поле с методами (геттерами или сеттерами) доступа, которые придерживаются шаблона JavaBean (в начале идет getXXX, setXXX или isXXX в случае с Boolean).
При выборе между доступом к полям (атрибуты) или доступом к свойствам (геттеры) необходимо определить
@Entity
public class Customer {
··@Id @GeneratedValue
··private Long id;
··@Column(name = "first_name", nullable = false, length = 50)
··private String firstName;
··@Column(name = "last_name", nullable = false, length = 50)
··private String lastName;
··private String email;
··@Column(name = "phone_number", length = 15)
··private String phoneNumber;
··// Конструкторы, геттеры, сеттеры
}
При использовании доступа к свойствам, как показано в листинге 5.22, отображение базируется на геттерах, а не на атрибутах. Все геттеры, не снабженные аннотацией @Transient, являются постоянными.
@Entity
public class Customer {
··private Long id;
··private String firstName;
··private String lastName;
··private String email;
··private String phoneNumber;
··// Конструкторы
··@Id @GeneratedValue
··public Long getId() {
····return id;
··}
··public void setId(Long id) {
····this.id = id;
··}
··@Column(name = "first_name", nullable = false, length = 50)
··public String getFirstName() {
····return firstName;
··}
··public void setFirstName(String firstName) {
····this.firstName = firstName;
··}
··@Column(name = "last_name", nullable = false, length = 50)
··public String getLastName() {
····return lastName;
··}
··public void setLastName(String lastName) {
····this.lastName = lastName;
··}
··public String getEmail() {
····return email;
··}
··public void setEmail(String email) {
····this.email = email;
··}
··@Column(name = "phone_number", length = 15)
··public String getPhoneNumber() {
····return phoneNumber;
··}
··public void setPhoneNumber(String phoneNumber) {
····this.phoneNumber = phoneNumber;
··}
}
В плане отображения две сущности из листингов 5.21 и 5.22 полностью идентичны, поскольку имена атрибутов в данном случае совпадают с именами геттеров. Однако вместо использования типа доступа по умолчанию вы можете явным образом указать тип с помощью аннотации @javax.persistence.Access.
Эта аннотация принимает два возможных значения — FIELD или PROPERTY, а также может быть использована в отношении сущности как таковой и/или каждого атрибута или геттера. Например, при применении @Access(AccessType.FIELD) к сущности поставщиком постоянства будут приниматься во внимание только аннотации отображения, которыми снабжены атрибуты. Тогда можно будет выборочно обозначить отдельные геттеры для доступа к свойствам посредством @Access(AccessType.PROPERTY).