Примечание

В Java поле определяется как атрибут экземпляра. Свойство — это любое поле с методами (геттерами или сеттерами) доступа, которые придерживаются шаблона JavaBean (в начале идет getXXX, setXXX или isXXX в случае с Boolean).

При выборе между доступом к полям (атрибуты) или доступом к свойствам (геттеры) необходимо определить тип доступа. По умолчанию для сущности применяется один тип доступа: это либо доступ к полям, либо доступ к свойствам, но не оба сразу (например, поставщик постоянства получает доступ к постоянному состоянию либо посредством атрибутов, либо посредством методов-геттеров). Согласно спецификации поведение приложения, в котором сочетается применение аннотаций к полям и свойствам без указания типа доступа явным образом, является неопределенным. При использовании доступа к полям (листинг 5.21) поставщик постоянства отображает атрибуты.

Листинг 5.21. Сущность Customer с аннотированными полями

@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, являются постоянными.

Листинг 5.22. Сущность Customer с аннотированными свойствами

@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).

Перейти на страницу:

Похожие книги