Обнуляет ссылку на сущность из другого хранилища

Здравствуйте.

Jmix version: 2.1.3
Jmix Studio plugin version: 2.1.2-232
IntelliJ version: IntelliJ IDEA 2023.2.5 (Community Edition)

Странная ситуация-на форме есть таблица сущностей(SpareParts), одно из полей данной сущности-ссылка на сущность из другого хранилища (там сущности только для чтения).

   @SystemLevel
   @Column(name = "SPARE_PART_FROM_ISP_ID", length = 23)
   private String sparePartFromISPId;

   @DependsOnProperties({"sparePartFromISPId"})
   @JmixProperty
   @Transient
   private Isp sparePartFromISP;

При сохранении формы-данная ссылка обнуляется ((.

Сохранял и через dataContext, и через получение данных из collectionContainer:

List<SparePart> spareParts = sparePartsForBoxesDc.getMutableItems();
        SaveContext saveContext = new SaveContext();
        spareParts.forEach(obj -> {
            saveContext.saving(obj);

        });
EntitySet ret = dataManager.save(saveContext);

Например в дебаггере перед dataManager.save я вижу что String ссылки на сущность из другого хранилища содержит запись, а после save она null.
Подскажите что я неправильно понимаю?

Добрый день!

Данный атрибут ( sparePartFromISP) включен у вас в fetch plan?
Посмотрите в entity inspector (или в базе) - атрибут с айдишником связанной сущности ( SPARE_PART_FROM_ISP_ID) у вас фактически проставлен?

  1. У меня стоял , сделал
           <fetchPlan>                    
                    <property name="sparePartFromISPId"/>
<!--                    <property name="sparePartFromSPId"/>-->
                    <property name="sparePartFromPIId"/>
                    <property name="name"/>
                    <property name="m"/>
                    <property name="x"/>
                    <property name="y"/>
                    <property name="z"/>
                    <property name="decNo"/>
           </fetchPlan>

Причем странно- у меня всего есть 3 поля-ссылки на другое хранилище, и если я указал в fetchPlane только одно то стал получать ошибку:
RuntimeException: Unable to access value holder for property: sparePartFromSP

Когда прописал все три поля, ошибка RuntimeException ушла, но поведение осталось прежним:
обнуляются ссылки на сущности из других БД, хотя я с ними не работаю на форме(

В entity inspector я и наблюдаю пропадание из данного поля ссылки на другую БД, оно заполнено, но при изменении x,y,z,m и сохранении обнуляется ссылка из других полей, с которыми я и не работаю.

Не совсем понял. Атрибута sparePartFromISP у вас в фетч-плане я не вижу. В фетч-плане должны быть оба атрибута, как поле с идентификатором, так и с самой связанной сущностью: sparePartFromISP и sparePartFromISPId. У меня на это было подозрение.
Если при наличии обоих атрибутов в фетч-плане у вас ссылка почему-то не грузится или обнуляется, то попробуйте воспрозвести ваш случай на демо-проекте и приложите его сюда. Так будет проще идентифицировать и понять проблему.

Как я понимаю fetchPlan нужен только для жадной загрузки, если что сработает и ленивая.
Добавил все поля в fetchPlan-ничего не поменялось.
Мне связанные поля не нужны на форме, я их не редактирую, редактирую другие, и вот при сохранении сущности, измененные поля сохраняются, но почему то связанные сущности также обнуляются, хотя я их не трогаю, на форму не вывожу.
Попробую сделать демо проект, не знаю сумею ли воспроизвести на БД основанных на файловой системе.

Если будет проект, где обе базы будут, например, PostgreSQL - тоже нормально. Тогда Jmix-приложение создаст эти новые базы и мы просто повторим описанные вами шаги, которые должны привести к ошибке.

TestLink.zip (3.8 МБ)

В корне проекта Readme.txt я там описал основные действия.

Если в вашем демо-проекте в fetch-plan на экране ChangeStory-view.xml добавить свойство basedOn, то данные обнуляться перестанут:

        <collection id="storyDc" class="com.company.testlink.entity.Story">
            <fetchPlan extends="_base">
                <property name="basedOn"/>
            </fetchPlan>
            <loader id="storyDl">
                <query>
                    <![CDATA[select e from Story e ]]>
                </query>
            </loader>
        </collection>

Причину будет видно, если дебаггером встанете в метод io.jmix.core.impl.UnconstrainedDataManagerImpl#writeCrossDataStoreReferences.

Там срабатывает следующая логика: проверяется, нет ли значения null в поле basedOn. Если оно null, то подразумевается, что мы специально обнулили ссылку, следовательно надо обнулить связанный айдишник basedOnId.

Спасибо большое. Подскажите это есть в документации и я просто пропустил? Где почитать?
Или случай редкий и не описан?

Конкретно ваша проблема нигде не описана. Я первый раз с такой проблемой сталкиваюсь. Информация о ссылочном поле на дополнительный дата-стор вроде бы только тут Entities :: Jmix Documentation

1 симпатия