Сохранение связных сущностей с использованием экранов

Здравствуйте! Столкнулся с проблемой при сохранении сущности A вместе с добавленными сущностями B. При попытке сохранить сущность A, в которой были добавлены новые объекты B, возникает ошибка, и сохранение не происходит.

@JmixEntity
@Table(name = "B")
@Entity(name = "B")
open class B {

    @OnDeleteInverse(DeletePolicy.CASCADE)
    @JoinColumn(name = "A_ID", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    var a: A? = null

    ...
@JmixEntity
@Table(name = "A")
@Entity(name = "A)
open class A {
    ...

    @Composition
    @OnDelete(DeletePolicy.CASCADE)
    @OneToMany(mappedBy = "a", cascade = [CascadeType.MERGE])
    var bList: MutableList<B> = NotInstantiatedList()
}

В DetailView сущности A я добавил вкладку с DataGrid, чтобы можно было управлять связанными объектами B:

<tab id="bTab">
    <vbox spacing="true" padding="false" maxHeight="100%">
        <hbox id="buttonsPanel" classNames="buttons-panel">
            <button id="addBtn" action="bDataGrid.add" themeNames="primary"/>
            <button id="editBtn" action="bDataGrid.edit"/>
            <button id="removeBtn" action="bDataGrid.remove"/>
        </hbox>
        <dataGrid id="bDataGrid"
                  minHeight="50em"
                  dataContainer="bDc"
                  columnReorderingAllowed="true">
            <actions>
                <action id="add" type="list_add"/>
                <action id="edit" type="list_edit"/>
                <action id="remove" type="list_remove"/>
            </actions>
            <columns resizable="true">
                <column property="x" autoWidth="true"/>
                <column property="y" autoWidth="true"/>
            </columns>
        </dataGrid>
    </vbox>
</tab>

В коде экрана сущности А я реализовал добавление новой сущности B следующим образом:

    @Subscribe("bDataGrid.add")
    private fun onBDataGridAdd(event: ActionPerformedEvent) {
        val B = dataManager.create(B::class.java)
        b.a = editedEntity
        val window = dialogWindows.detail<B, BDetailView>(bDataGrid)
            .withViewClass(BDetailView::class.java)
            .editEntity(b)
            .build()
        window.setSizeFull()
        window.open()
    }

Как правильно организовать сохранение сущностей B вместе с сущностью A, чтобы не возникало ошибок?

Созданную сущность надо добавить в dataContext текущего экрана.
https://docs.jmix.ru/jmix/flow-ui/data/data-context.html

Если у вас a nullable = false, то зачем вы используете list_add? list_create По дефолту должен сам все делать без каких либо доработок.

(Или там надо будет добавить openMode = DIALOG, если у вас основной экран не в диалоге открывается). Вообще студия должна генерить нормально работающий экран.

А что за ошибка то?

  1. Как вы определили container bDc в экране?
    В идеале это должен быть дочерний контейнер свойств CollectionPropertyContainer (как stepsDs в этом примере: Контейнеры свойств :: Документация Jmix)

  2. Если хотите создать новую дочернюю сущность и заполнить ее в модальном диалоге, то не нужно создавать её самостоятельно и использовать .editEntity(b).

Цепочка вызовов с DialogWindows должна быть такая:

        DialogWindow<ChildEntity> dialogWindow = dialogWindows
                .detail(this, ChildEntity.class)
                .withViewClass(ChildEntityDetailView.class)
                .withParentDataContext(dataContext)
                .withContainer(bDc)
                .newEntity()
                .withInitializer(entity -> {
                    // тут можно заполнить новую сущность свойствами
                })
                .build();

.withParentDataContext() и .withContainer() обязательны, чтобы композиция срабатывала как ожидается (дочерняя сущность сохранялась не сразу, а только при сохранении внешнего экрана).

Для действия edit в диалоге должно быть примерно то же, только вместо .newEntity() - уже будет .editEntity()