Тип доступа встраиваемого класса. Тип доступа встраиваемого класса обуславливается типом доступа класса-сущности, в котором он располагается. Если сущность явным образом использует такой тип доступа, как доступ к свойствам, то встраиваемый объект будет неявно использовать аналогичный тип доступа. Другой тип доступа для встраиваемого класса можно указать с помощью аннотации @Access.

Сущности Customer (листинг 5.33) и Address (листинг 5.34) задействуют разные типы доступа.

Листинг 5.33. Сущность Customer с таким типом доступа, как доступ к полям

@Entity

@Access(AccessType.FIELD)

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;

··@Embedded

··private Address address;

··// Конструкторы, геттеры, сеттеры

}

Листинг 5.34. Встраиваемый объект с таким типом доступа, как доступ к свойствам

@Embeddable

@Access(AccessType.PROPERTY)

public class Address {

··private String street1;

··private String street2;

··private String city;

··private String state;

··private String zipcode;

··private String country;

··// Конструкторы

··@Column(nullable = false)

··public String getStreet1() {

····return street1;

··}

··public void setStreet1(String street1) {

····this.street1 = street1;

··}

··public String getStreet2() {

····return street2;

··}

··public void setStreet2(String street2) {

····this.street2 = street2;

··}

··@Column(nullable = false, length = 50)

··public String getCity() {

····return city;

··}

··public void setCity(String city) {

····this.city = city;

··}

··@Column(length = 3)

··public String getState() {

····return state;

··}

··public void setState(String state) {

····this.state = state;

··}

··@Column(name = "zip_code", length = 10)

··public String getZipcode() {

····return zipcode;

··}

··public void setZipcode(String zipcode) {

····this.zipcode = zipcode;

··}

··public String getCountry() {

····return country;

··}

··public void setCountry(String country) {

····this.country = country;

··}

}

Настоятельно рекомендуется явным образом задавать тип доступа для встраиваемых объектов, чтобы избежать ошибок отображения, когда один встраиваемый объект окажется встроенным во множественные сущности. К примеру, расширим нашу модель, добавив сущность Order, как показано на рис. 5.4. Address теперь будет встроен в Customer и Order.

Рис. 5.4. Address встроен в Customer и Order

Для каждой сущности определяется отличающийся тип доступа: Customer использует доступ к полям, а Order — доступ к свойствам. Поскольку тип доступа встраиваемого объекта обуславливается типом доступа класса-сущности, в котором он объявлен, Address будет отображен двумя разными путями, что может привести к проблемам отображения. Чтобы этого не случилось, тип доступа Address должен быть задан явным образом.

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

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