Как вы можете видеть в листингах 5.35 и 5.36, эти две сущности снабжены минимально необходимыми нотациями: @Entity с @Id и @GeneratedValue для первичного ключа и все. При использовании конфигурации в порядке исключения поставщик постоянства отобразит эти две сущности в две таблицы, а также внешний ключ для связи (из customer, указывающего на address). Отображение «один к одному» инициируется тем фактом, что Address является объявленной сущностью и включает сущность Customer как атрибут. Мы автоматически предполагаем связь, используя одну сущность как свойство другой, поэтому нам не нужна аннотация @OneToOne, поскольку она опирается на правила по умолчанию (листинги 5.37 и 5.38).

Листинг 5.37. Таблица CUSTOMER с внешним ключом к ADDRESS

create table CUSTOMER (

··ID BIGINT not null,

··FIRSTNAME VARCHAR(255),

··LASTNAME VARCHAR(255),

··EMAIL VARCHAR(255),

··PHONENUMBER VARCHAR(255),

··ADDRESS_ID BIGINT,

··primary key (ID),

··foreign key (ADDRESS_ID) references ADDRESS(ID)

);

Листинг 5.38. Таблица ADDRESS

create table ADDRESS (

··ID BIGINT not null,

··STREET1 VARCHAR(255),

··STREET2 VARCHAR(255),

··CITY VARCHAR(255),

··STATE VARCHAR(255),

··ZIPCODE VARCHAR(255),

··COUNTRY VARCHAR(255),

··primary key (ID)

);

Как вы уже знаете, при использовании JPA, если не аннотировать атрибут, будут применены правила отображения по умолчанию. Таким образом, изначально внешний ключ будет носить имя ADDRESS_ID (листинг 5.37), которое представляет собой конкатенацию имени атрибута связи (здесь это address), символа «_» и имени столбца первичного ключа целевой таблицы (здесь им будет идентификатор столбца таблицы ADDRESS). Обратите также внимание, что в DDL-коде столбец ADDRESS_ID по умолчанию является nullable, а это означает, что ассоциация «один к одному» отображается в нуль (значение null) или единицу.

Для настройки отображения вы можете использовать две аннотации. Первая — @OneToOne (поскольку кардинальность отношения равна единице). Она позволяет модифицировать отдельные атрибуты ассоциации как таковой, например, подход, посредством которого должна осуществляться ее выборка. В листинге 5.39 определен API-интерфейс аннотации @OneToOne.

Листинг 5.39. API-интерфейс аннотации @OneToOne

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface OneToOne {

··Class targetEntity() default void.class;

··CascadeType[] cascade() default {};

··FetchType fetch() default EAGER;

··boolean optional() default true;

··String mappedBy() default "";

··boolean orphanRemoval() default false;

}

Второй аннотацией является @JoinColumn (ее API-интерфейс очень схож с API-интерфейсом аннотации @Column из листинга 5.12). Она используется для настройки столбца соединения, то есть внешнего ключа владеющей стороны. В листинге 5.40 показано, как вы применили бы две эти аннотации.

Листинг 5.40. Сущность Customer с настроенным отображением связей

@Entity

public class Customer {

··@Id @GeneratedValue

··private Long id;

··private String firstName;

··private String lastName;

··private String email;

··private String phoneNumber;

··@OneToOne (fetch = FetchType.LAZY)

··@JoinColumn(name = "add_fk", nullable = false)

··private Address address;

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

}

В JPA внешний ключ называется столбцом соединения. Аннотация @JoinColumn позволяет вам настраивать отображение внешнего ключа. В листинге 5.40 она используется для переименования столбца внешнего ключа в ADD_FK, а также для того, чтобы сделать связь обязательной, отклонив значение null (nullable=false). Аннотация @OneToOne подсказывает поставщику постоянства о том, что выборка связи должна быть отложенной (подробнее об этом мы поговорим позднее).

Однонаправленная связь с использованием @OneToMany
Перейти на страницу:

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