MappedSuperClass x 2 + InstanceName + иногда cannot get unfetched attribute

Добрый день!
Есть MappedSuperclass NamedEntity, содержащий traits и поля code, name, description. InstanceName установлено в code
Есть другой MappedSuperclass, NamedHierarchyEntity, дочерний от NamedEntity, c полем fullCode (+поля, унаследованные от NamedEntity). InstanceName установлено в code.
Есть Entity DemoResourceClass, у которого parent = NamedHierarcyEntity (InstanceName=fullCode)
Есть MappedSuperclass CommonResource (parent=NamedEntity) с полем resourceClass (association ManyToOne с DemoResourceClass.
И есть производный от него DemoResource (с полем quantity).
На форме DemoResourceEdit есть EntityPicker

                    <entityPicker id="resourceClassField" property="resourceClass">
                        <actions>
                            <action id="entityLookup" type="entity_lookup"/>
                            <action id="entityClear" type="entity_clear"/>
                        </actions>
                    </entityPicker>

Судя по всему, неправильно определяется InstanceName для DemoResourceClass (берется из NamedEntity (дед), а не из NamedHierarchyEntity (прямой родитель)), т.к. при выборе в pickerе и на browse-форме DemoResource в поле resourceClass отображается code, а не ожидаемый fullCode.

  • (не воспроизводится в демке, но упорно преследует на рабочем проекте, где структура построена таким же образом) при сохранении новой записи выдает cannot get unfetched attribute [code] (плавающее, в некоторых местах вылезает и при редактировании.
java.lang.IllegalStateException: Cannot get unfetched attribute [name] from detached object ru.borlas.msutoir.entity.ResultInputOption-c1a4f126-4523-e606-562d-1f9bf0cea512 [detached].
	at org.eclipse.persistence.internal.queries.EntityFetchGroup.onUnfetchedAttribute(EntityFetchGroup.java:100)
	at io.jmix.eclipselink.impl.JmixEntityFetchGroup.onUnfetchedAttribute(JmixEntityFetchGroup.java:78)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.processUnfetchedAttribute(EntityManagerImpl.java:3027)
	at ru.borlas.msutoir.entity.ResultInputOption._persistence_checkFetched(ResultInputOption.kt)
	at ru.borlas.msutoir.entity.ResultInputOption._persistence_get_name(ResultInputOption.kt)
	at ru.borlas.msutoir.entity.ResultInputOption.getName(ResultInputOption.kt:35)
	at io.jmix.core.entity.BaseEntityEntry.getAttributeValue(BaseEntityEntry.java:85)
	at io.jmix.core.entity.EntityValues.getValue(EntityValues.java:100)
	at io.jmix.core.impl.InstanceNameProviderImpl.getInstanceName(InstanceNameProviderImpl.java:141)
	at io.jmix.core.MetadataTools.getInstanceName(MetadataTools.java:214)
	at io.jmix.core.MetadataTools.format(MetadataTools.java:157)
	at io.jmix.ui.component.impl.AbstractTable.formatCellValue(AbstractTable.java:1269)

При этом программного добавления записей нет, все через UI. Спасаемся этим:

    @Install(target = Target.DATA_CONTEXT)
    private fun commitDelegate(saveContext: SaveContext?): MutableSet<Any> {
        saveContext!!.fetchPlans[editedEntity] = editedEntityContainer.fetchPlan
        return dataManager.save(saveContext)
    }

Помогает, но это костыль. Может, мы что-то концептуально неправильно делаем?
Ругается именно на InstanceName, и именно в тех случаях, когда InstanceName наследуется от MappedSuperclass.

Есть ли какой-то способ получать InstanceName от прямого родителя, а не от корневого?

И подскажите, пожалуйста, в каком направлении рыть, чтобы полностью избавиться от get unfetched attribute?

UnfetchedDemo.zip (167.6 КБ)

Возможно в базовом классе добавить метод getInstanceName(). И в нужных классах его переопределять (В переопределяемых классах так-же добавлять аннотации InstanceName и DependsOnProperties). Думаю ошибка с unfetched attribute так-же должна уйти.

Как я понимаю проблема в том что в InstanceNameProviderImpl#parseNamePattern берется первая property аннотировная InstanceName и нет проверки на extend у класса если есть несколько property. Думаю можно оформить issue на этот случай на гите.

2 симпатии

Добрый день!

Как правильно заметил @yarik1706, похоже, проблема в InstanceNameProviderImpl#parseNamePattern. Спасибо за то, что сообщили о ней и предоставили пример. Был создан тикет.

В качестве воркэраунда самым простым решением будет, как было предложено выше, объявление @InstanceName на методе с его переопределением.

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

1 симпатия