··@Id @GeneratedValue
··protected Long id;
··@Column(length = 50, nullable = false)
··protected String title;
··protected Float price;
··@Column(length = 2000)
··protected String description;
··// Конструкторы, геттеры, сеттеры
}
Как вы можете видеть в листинге 5.67, атрибуты title и description снабжены аннотацией @Column. В листинге 5.68 показана сущность Book, расширяющая Item.
@Entity
public class Book extends Item {
··private String isbn;
··private String publisher;
··private Integer nbOfPage;
··private Boolean illustrations;
··// Конструкторы, геттеры, сеттеры
}
Эта иерархия будет отображена только в одну таблицу. Item не является сущностью и не содержит таблиц. Атрибуты Item и Book были бы отображены в столбцы таблицы BOOK, кроме того, отображенные суперклассы также совместно используют свою информацию об отображении. Аннотации @Column отображенного суперкласса Item будут унаследованы. Однако, поскольку такие суперклассы не являются сущностями, которые находятся под управлением, вы не смогли бы, к примеру, обеспечить их постоянство или выполнять к ним запросы. В листинге 5.69 показана структура таблицы BOOK с настроенными столбцами TITLE и DESCRIPTION.
create table BOOK (
··ID BIGINT not null,
··TITLE VARCHAR(50) not null,
··PRICE DOUBLE(52, 0),
··DESCRIPTION VARCHAR(2000),
··ILLUSTRATIONS SMALLINT,
··ISBN VARCHAR(255),
··NBOFPAGE INTEGER,
··PUBLISHER VARCHAR(255),
··primary key (ID)
);
Резюме
Благодаря конфигурации в порядке исключения немногое требуется для того, чтобы отобразить сущности в таблицах. Проинформируйте поставщика постоянства о том, что класс на самом деле является сущностью (посредством @Entity), атрибут — его идентификатором (посредством @Id), а JPA сделает все остальное. Эта глава могла бы быть намного короче, если бы мы придерживались в ней только того, что применяется по умолчанию. JPA обладает очень богатым набором аннотаций для настройки всех мелких деталей объектно-реляционного отображения (а также эквивалентного XML-отображения).
Элементарные аннотации могут быть использованы в отношении атрибутов (@Basic, @Temporal и т. д.) или классов для настройки отображения. Вы можете изменить имя таблицы либо тип первичного ключа или даже избегать отображения с помощью аннотации @Transient. Применяя JPA, вы можете отображать коллекции базовых типов или встраиваемых объектов. В зависимости от своей бизнес-модели вы можете отображать связи (@OneToOne, @ManyToMany и т. д.) с разными направлениями и множественностью. То же самое касается и наследования (@Inheritance, @MappedSuperclass и т. д.), при котором допустимо использовать разные стратегии для отображения иерархий, где смешаны сущности и классы, не являющиеся сущностями.
В этой главе внимание было сосредоточено на статической части JPA, или на том, как отображать сущности в таблицах. В следующей главе рассматриваются динамические темы: как управлять этими сущностями и выполнять к ним запросы.
Глава 6. Управление постоянными объектами
У Java Persistence API имеется две стороны. Первая — это способность отображать объекты в реляционные базы данных. Конфигурация в порядке исключения дает поставщикам постоянства возможность выполнять большую часть работы с использованием малого количества кода, а функционал JPA также позволяет осуществлять настроенное отображение из объектов в таблицы с помощью аннотаций или XML-дескрипторов. JPA предлагает широкий спектр настроек, начиная с простого отображения (изменения имени столбца) и заканчивая более сложным (наследованием). Благодаря этому вы сможете отобразить почти любую объектную модель в унаследованной базе данных.
Другая сторона JPA — это способность выполнять запросы к этим отображенным объектам. В JPA централизованной службой для манипулирования экземплярами сущностей является менеджер сущностей. Это API-интерфейс для создания, поиска, удаления и синхронизации объектов с базой данных. Он также позволяет выполнять разнообразные JPQL-запросы, например динамические, статические или «родные» запросы к сущностям. При использовании менеджера сущностей также возможно применение механизмов блокировки.