В приведенных ранее примерах сущность Item представляла собой конкретный класс. Она была снабжена аннотацией @Entity и не имела ключевого слова abstract, однако абстрактный класс тоже может быть определен как сущность. Абстрактная сущность отличается от конкретной только тем, что нельзя непосредственно создать ее экземпляр с помощью ключевого слова new. Она обеспечивает общую структуру данных для своих листовых сущностей (Book и CD) и придерживается соответствующих стратегий отображения. Для поставщика постоянства абстрактная сущность отображается как обычная сущность. Единственное отличие заключается в пространстве Java, а не в отображении.
Классы, которые не являются сущностями, также называют
Например, Book представляет собой сущность (листинг 5.65) и расширяет Item, который не является сущностью (у Item нет аннотаций), как показано в листинге 5.64.
public class Item {
··protected String title;
··protected Float price;
··protected String description;
··// Конструкторы, геттеры, сеттеры
}
Сущность Book (см. листинг 5.65) наследует от Item, поэтому Java-код может получить доступ к атрибутам title, price и description, а также к любому другому методу, который определен обычным, объектно-ориентированным, путем. Item может быть конкретным или абстрактным и не влияет на финальное отображение.
@Entity
public class Book extends Item {
··@Id @GeneratedValue
··private Long id;
··private String isbn;
··private String publisher;
··private Integer nbOfPage;
··private Boolean illustrations;
··// Конструкторы, геттеры, сеттеры
}
Класс Book является сущностью и наследует от Item. Однако в таблице были бы отображены только атрибуты Book. Атрибуты Item в структуре таблицы, определенной в листинге 5.66, отсутствуют. Чтобы обеспечить постоянство Book, вам потребуется создать экземпляр Book, задать значения для любых атрибутов по вашему желанию (title, price, isbn, publisher и т. д.), однако будет обеспечено постоянство только атрибутов Book (id, isbn и т. д.).
create table BOOK (
··ID BIGINT not null,
··ILLUSTRATIONS SMALLINT,
··ISBN VARCHAR(255),
··NBOFPAGE INTEGER,
··PUBLISHER VARCHAR(255),
··primary key (ID)
);
JPA определяет особый тип классов, называемых
При использовании корневого класса Item снабжается аннотацией @MappedSuperclass, а не @Entity, как показано в листинге 5.67. В данном случае определяется стратегия наследования (JOINED), а также аннотируются некоторые из его атрибутов с использованием @Column. Однако, поскольку отображенные суперклассы не отображаются в таблицах, не допускается применять аннотацию @Table.
@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public class Item {