Тип доступа встраиваемого класса. Тип доступа встраиваемого класса обуславливается типом доступа класса-сущности, в котором он располагается. Если сущность явным образом использует такой тип доступа, как доступ к свойствам, то встраиваемый объект будет неявно использовать аналогичный тип доступа. Другой тип доступа для встраиваемого класса можно указать с помощью аннотации @Access.
Сущности Customer (листинг 5.33) и Address (листинг 5.34) задействуют разные типы доступа.
@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;
··// Конструкторы, геттеры, сеттеры
}
@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 должен быть задан явным образом.