2.2. Создание модели данных

Создадим класс сущности EBook, представляющий собой электронную версию издания книги. Класс EBook должен быть унаследован от Card (карточки процесса), чтобы управлять состоянием EBook в соответствии с требуемым бизнес-процессом.

Перейдите на вкладку Entities панели навигатора Studio, выберите пакет com.sample.library.entity и нажмите New entity. Введите следующие значения свойств сущности:

  • Class name - EBook

  • Table - LIBRARY_EBOOK

  • Parent class - Card [wf$Card]. Для класса Card определена стратегия наследования InheritanceType.JOINED, поэтому EBook будет храниться в отдельной таблице и его первичный ключ будет одновременно внешним ключом, сылающимся на первичный ключ Card.

  • Discriminator - 10. Дискриминатор - это значение поля базового типа, которое будет установлено в базе данных для всех экземпляров конкретного типа. В данном случае для базового класса Card определены аннотации:

    @DiscriminatorColumn(name = "CARD_TYPE", discriminatorType = DiscriminatorType.INTEGER)
    @DiscriminatorValue("0")

    Это означает, что в поле CARD_TYPE должно храниться значение целого типа, и для экземпляров базового типа это будет значение 0. Поэтому для типа EBook можно задать любое значение, отличное от 0.

  • В поле Primary key join column Studio автоматически сформирует имя CARD_ID для первичного ключа создаваемой сущности.

  • В поле Referenced primary key column Studio выберет первичный ключ таблицы WF_CARD, хранящей базовую сущность Card, то есть ID.

Далее, создадим атрибут сущности, содержащий ссылку на издание книги.

Нажмите New под списком атрибутов и в окне Create attribute задайте следующие свойства:

  • Name - publication

  • Attribute type - ASSOCIATION

  • Type - BookPublication [library$BookPublication]

  • Mandatory - on. Атрибут будет обязательным для заполнения.

  • Cardinality - MANY_TO_ONE. Это означает, что несколько экземпляров EBook могут быть созданы для одного экземпляра BookPublication.

  • В поле Column будет предложено подходящее имя колонки - PUBLICATION_ID.

Рисунок 2.1. Редактор сущности

Редактор сущности

Сохраните изменения. В результате будет создан следующий класс сущности:

package com.sample.library.entity;

import javax.persistence.*;

import com.haulmont.workflow.core.entity.Card;

@PrimaryKeyJoinColumn(name = "CARD_ID", referencedColumnName = "ID")
@DiscriminatorValue("10")
@Table(name = "LIBRARY_EBOOK")
@Entity(name = "library$EBook")
public class EBook extends Card {
    private static final long serialVersionUID = -7326357893869004530L;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "PUBLICATION_ID")
    protected BookPublication publication;

    public void setPublication(BookPublication publication) {
        this.publication = publication;
    }

    public BookPublication getPublication() {
        return publication;
    }
}

После создания класса сущности Studio сообщит о том, что модель данных изменена по сравнению с текущей схемой базы данных. Требуется сгенерировать скрипты и запустить создание или обновление БД.

Нажмите Generate DB scripts в секции Entites на панели навигатора. Studio сгенерирует скрипты обновления и инициализации БД, включающие в себя создание таблицы LIBRARY_EBOOK и ее внешних ключей. Так как в нашей БД еще нет никаких данных, и мы можем безболезненно пересоздать ее, скрипты на вкладке Update scripts можно сразу удалить. После этого сохраните изменения.

Остановите сервер приложения командой Run -> Stop application server. Через несколько секунд станет доступным пункт меню Run -> Create database, который и нужно выполнить.