ConstraintViolationException при использовании DependsOnProperties и additional-stores

Версия jmix 2.2.3

Сущность:

@JmixEntity
@Table(name = "JT_TEST_ENTITY")
@Entity(name = "jt_TestEntity")
open class TestEntity {
    @JmixGeneratedValue
    @Column(name = "ID", nullable = false)
    @Id
    var id: UUID? = null

    @NotNull
    @InstanceName
    @Column(name = "NAME")
    var name: String? = null

    @NotNull
    @Column(name = "BOOL_VAR", nullable = false)
    var boolVar: Boolean? = false

    @Transient
    @JmixProperty
    var testDto: TestDto? = null

    @Transient
    @JmixProperty
    var testDto2: TestDto? = null

    @JmixProperty
    @DependsOnProperties("boolVar")
    fun getTestDtoForGrid(): TestDto? {
        return if (boolVar == true) {
            testDto
        } else {
            testDto2
        }
    }

    @PostConstruct
    fun postConstruct(dataManager: DataManager) {
        testDto = dataManager.create(TestDto::class.java)
        testDto2 = dataManager.create(TestDto::class.java)
    }

}

В проект добавлен

jmix.core.store-descriptor_elastic=test_ElasticStoreDescriptor
jmix.core.additional-stores=elastic

При сохранении новой сущности падает ошибка ConstraintViolationException
image

В DataContextImpl поле boolVar установлено:
image

Но в методе UnconstrainedDataManagerImpl#writeCrossDataStoreReferences оно обнуляется:

image

Если убрать

jmix.core.store-descriptor_elastic=test_ElasticStoreDescriptor
jmix.core.additional-stores=elastic

или @DependsOnProperties("boolVar"), то все сохраняется нормально.

Проект прикладываю:
jmix-test.zip (121.2 КБ)

Подниму тему. Мб в UnconstrainedDataManagerImpl#writeCrossDataStoreReferences стоит добавить проверку если

propertyMetaClass.getStore().getName() != NoopDataStore.name?

image

Ярослав, здравствуйте!

Прошу прощения за поздний ответ.
Да, с этим методом однозначно нужно что-то сделать! Спасибо за то, что обнаружили и изучили проблему, завел issue.

В качестве временного решения - да, должно сработать исключение свойства с noop Datastore. Лучше, расширив UnconstrainedDataManagerImpl, сделать так:

    protected boolean writeCrossDataStoreReferences(Object entity, Collection<Object> allEntities) {
        if (stores.getAdditional().isEmpty())
            return false;

        boolean repeatRequired = false;
        MetaClass metaClass = metadata.getClass(entity);
        for (MetaProperty property : metaClass.getProperties()) {
            if (property.getRange().isClass() && !property.getRange().getCardinality().isMany()
                    && !Stores.NOOP.equals(property.getStore().getName())) {
                //...

С уважением,
Дмитрий