Композиция и наследование

Добрый день!
пример проекта:
specifInheritance.zip (93.3 КБ)

Есть две базовые сущности BaseItemsList и BaseItem, связанные композицией - BaseItem items.
Есть соответственно наследники ItemsList и Item.
Мне нужно создать экраны обзора и редактирования для наследников.
В экране обзора для ItemsList я сделал как написано в документации - две коллекции и обработка ItemChangeEvent

А вот в экране редактирования есть проблема. При декларативном описании в таблице с элементами списка ожидаемо сущность BaseItem.

    <data>
        <instance id="itemsListDc"
                  class="com.company.specifinheritance.entity.ItemsList">
            <fetchPlan extends="_base">
                <property name="items" fetchPlan="_base"/>
            </fetchPlan>
            <loader/>
            <collection id="itemsDc" property="items"/>
        </instance>
    </data>
.....
        <groupBox id="itemsBox" caption="msg://com.company.specifinheritance.entity/ItemsList.items">
            <table id="itemsTable" dataContainer="itemsDc" width="100%" height="200px">
                <actions>
                    <action id="create" type="create"/>
                    <action id="edit" type="edit"/>
                    <action id="remove" type="remove"/>
                </actions>
                <columns>
                    <column id="name"/>
                </columns>
                <buttonsPanel>
                    <button action="itemsTable.create"/>
                    <button action="itemsTable.edit"/>
                    <button action="itemsTable.remove"/>
                </buttonsPanel>
            </table>
        </groupBox>

Можно как-то указать для экрана редактирования ItemsList указать, что в атрибуте items будут сущности Item?
Или придется создать отдельный источник данных с сущностями Item для таблицы и делать всю обработку по изменению списка (создание, редактирование, удаление) в коде контроллера?

Возможно будет лучше BaseItem и BaseItemsList сделать абстрактными MappedSuperclass?

@JmixEntity
@MappedSuperclass
abstract public class BaseItem<T extends BaseItemsList> {

    abstract public T getItemsList();

    abstract public void setItemsList(T itemsList);
}
@JmixEntity
@MappedSuperclass
abstract public class BaseItemsList<T extends BaseItem> {
    abstract public List<T> getItems();

    abstract public void setItems(List<T> items);
}
@JmixEntity
@Table(name = "ITEM")
@Entity
public class Item extends BaseItem<ItemsList> {
    @OnDeleteInverse(DeletePolicy.CASCADE)
    @JoinColumn(name = "ITEMS_LIST_ID", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private ItemsList itemsList;

    @Override
    public ItemsList getItemsList() {
        return itemsList;
    }

    @Override
    public void setItemsList(ItemsList itemsList) {
        this.itemsList = itemsList;
    }

}
@JmixEntity
@Table(name = "ITEMS_LIST")
@Entity
public class ItemsList extends BaseItemsList<Item> {

    @OnDelete(DeletePolicy.CASCADE)
    @Composition
    @OneToMany(mappedBy = "itemsList")
    private List<Item> items;

    @Override
    public List<Item> getItems() {
        return items;
    }

    @Override
    public void setItems(List<Item> items) {
        this.items = items;
    }
}

А вообще из вопроса не понятно какую архитектуру вы пытаетесь заложить. Если все наследники Base классов будут по парно работать только друг с другом (что подразумевается по

, то MappedSuperclass как по мне наилучший вариант.

Если вы планируете. Что несколько наследников BaseItemsList могут ссылаться на одного наследника BaseItem (или несколько наследников BaseItemsList могут ссылаться на несколько наследников BaseItem то это), то скорее всего в экране нужно будет определять класс наследника и при этом (скорее всего) Inheritance должен быть SINGLE_TABLE

@yarik1706 Ярослав, спасибо, за вариант.

Планируется парное использование. Хотя, может быть и

несколько наследников BaseItemsList могут ссылаться на одного наследника BaseItem

На самом деле в реальном приложении BaseItemsList уже является наследником сущности MappedSuperclass и просто добавляет атрибут со списком items.

предложенный способ работает, но есть минус в том, что потребуется копировать атрибуты в наследниках.

Было бы удобнее, если бы в описании коллекции композитного поля можно было бы указать нужный тип (как и для редактируемой инстанции)(class=“com.company.specifinheritance.entity.Item”) и фреймворк делал бы нужные преобразования.

    <data>
        <instance id="itemsListDc"
                  class="com.company.specifinheritance.entity.ItemsList">
            <fetchPlan extends="_base">
                <property name="items" fetchPlan="_base"/>
            </fetchPlan>
            <loader/>
            <collection id="itemsDc" property="items" class="com.company.specifinheritance.entity.Item"/>
        </instance>
    </data>