Экран восстановления удаленных сущностей

Здравствуйте! При открытии экрана восстановления сущности возникает ошибка

java.lang.IllegalStateException: Cannot get unfetched attribute [translations] from detached object ru.infinnity.dma.entity.Nomenclature-d764b5f5-da63-4fc9-26f5-8ebbdf530f75 [detached].
	at org.eclipse.persistence.internal.queries.EntityFetchGroup.onUnfetchedAttribute(EntityFetchGroup.java:98)
	at com.haulmont.cuba.core.sys.persistence.CubaEntityFetchGroup.onUnfetchedAttribute(CubaEntityFetchGroup.java:74)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.processUnfetchedAttribute(EntityManagerImpl.java:2846)
	at com.haulmont.chile.core.model.impl.AbstractInstance._persistence_checkFetched(AbstractInstance.java)
	at ru.infinnity.dma.entity.Nomenclature._persistence_get_translations(Nomenclature.java)
	at ru.infinnity.dma.entity.Nomenclature.getTranslations(Nomenclature.java:108)
	at ru.infinnity.dma.entity.Nomenclature.getTargetLang(Nomenclature.java:120)
	at ru.infinnity.dma.entity.Nomenclature.getName(Nomenclature.java:219)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.haulmont.chile.core.model.utils.MethodsCache.invokeGetter(MethodsCache.java:71)
	at com.haulmont.chile.core.model.impl.AbstractInstance.getValue(AbstractInstance.java:102)
	at com.haulmont.cuba.core.entity.BaseGenericIdEntity.getValue(BaseGenericIdEntity.java:139)
	at com.haulmont.chile.core.model.utils.InstanceUtils.getInstanceName(InstanceUtils.java:235)
	at com.haulmont.chile.core.model.impl.AbstractInstance.getInstanceName(AbstractInstance.java:59)
	at com.haulmont.cuba.core.global.MetadataTools.format(MetadataTools.java:139)
	at com.haulmont.cuba.web.gui.data.PropertyWrapper.getFormattedValue(PropertyWrapper.java:149)
	at com.haulmont.cuba.web.gui.components.WebAbstractTable$TablePropertyWrapper.getFormattedValue(WebAbstractTable.java:2063)
	at com.haulmont.cuba.web.toolkit.ui.CubaTable.formatPropertyValue(CubaTable.java:268)
	at com.haulmont.cuba.web.toolkit.ui.CubaTable.getPropertyValue(CubaTable.java:228)
	at com.vaadin.ui.Table.parseItemIdToCells(Table.java:2387)
	at com.vaadin.ui.Table.getVisibleCellsNoCache(Table.java:2237)
	at com.vaadin.ui.Table.refreshRenderedCells(Table.java:1780)
	at com.vaadin.ui.Table.attach(Table.java:4320)
	at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:646)
	at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:720)
	at com.vaadin.ui.AbstractComponent.setParent(AbstractComponent.java:621)
	at com.vaadin.ui.AbstractComponentContainer.addComponent(AbstractComponentContainer.java:214)
	at com.vaadin.ui.AbstractOrderedLayout.addComponent(AbstractOrderedLayout.java:150)
	at com.haulmont.cuba.web.gui.components.WebAbstractBox.add(WebAbstractBox.java:61)
	at com.haulmont.cuba.web.gui.components.WebAbstractBox.add(WebAbstractBox.java:42)
	at com.haulmont.cuba.gui.app.core.restore.EntityRestore.buildLayout(EntityRestore.java:219)
	at com.haulmont.cuba.gui.app.core.restore.EntityRestore.lambda$init$0(EntityRestore.java:80)
	at com.haulmont.cuba.gui.app.core.restore.EntityRestore$$Lambda$179/24538346.valueChanged(Unknown Source)
	at com.haulmont.cuba.web.gui.components.WebLookupField$$Lambda$141/29978410.accept(Unknown Source)
	at com.haulmont.bali.events.EventRouter.fireEvent(EventRouter.java:45)
	at com.haulmont.cuba.web.gui.components.WebLookupField.lambda$attachListener$4850968e$1(WebLookupField.java:212)
	at com.haulmont.cuba.web.gui.components.WebLookupField$$Lambda$134/25148064.valueChange(Unknown Source)
	at sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
	at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037)
	at com.vaadin.ui.AbstractField.fireValueChange(AbstractField.java:1199)
	at com.vaadin.ui.AbstractField.setValue(AbstractField.java:600)
	at com.vaadin.ui.AbstractSelect.setValue(AbstractSelect.java:738)
	at com.vaadin.ui.AbstractField.setValue(AbstractField.java:494)
	at com.vaadin.ui.ComboBox.changeVariables(ComboBox.java:750)

Есть ли какой то способ повлиять на определения view этого экрана? Подскажите пожалуйста, буду рад любой помощи.

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

Если вы используете метод @MetaProperty в @NamePattern, то для него нужно указать атрибут related:

@MetaProperty(related = "targetLang")
public String getName() {
    return targetLang;
}

В этом случае нужные атрибуты будут включены в _minimal View.

Спасибо не знал о такой возможности. Ошибка сохранилась так как поле name с атрибутом @MetaProperty ссылается на targetLang c @MetaProperty если я в обоих случаях указываю атрибут related то вылетает аналогичная ошибка.
Поля в сущности выглядят таким образом

@Transient
@MetaProperty(related = "targetLang")
protected String name;

@Composition
@OneToMany(mappedBy = "nomenclature")
protected List<NomenclatureLocalization> translations;

@Transient
@MetaProperty(related = " translations")
protected NomenclatureLocalization targetLang;

геттеры и сеттеры

public void setTargetLang(NomenclatureLocalization targetLang) {
        this.targetLang = targetLang;
    }

    public void setName(String name) {
        getTargetLang().setName(name);
    }

    public String getName() {
        return getTargetLang().getName();
    }

    public NomenclatureLocalization getTargetLang() {
        if (this.targetLang != null) {
            return this.targetLang;
        }

        if (getTranslations() == null || getTranslations().isEmpty()) {
            return new NomenclatureLocalization();
        }

        NomenclatureLocalization defaultLang = null;

        UserSessionSource us = AppBeans.get(UserSessionSource.NAME);
        String currentLanguage = us.getLocale().getLanguage();
        Language language = Language.valueOf(currentLanguage);

        for (NomenclatureLocalization lang : getTranslations())
        {
            if (language.getId().equals(lang.language)) {
                this.targetLang = lang;
                return lang;
            }

            if (lang.getIsDefault()) {
                defaultLang = lang;
            }

            if (defaultLang == null) {
                defaultLang = lang;
            }
        }

        this.targetLang = defaultLang;
        return this.targetLang;
    }

Попробовал вот такой вариант

@Transient
@MetaProperty(related = "translations")
protected String name;

В таком случае translations включилось в view, но не могу получить доступ к его атрибутам. Вылетает ошибка:

java.lang.IllegalStateException: Cannot get unfetched attribute [isDefault] from detached object ru.infinnity.dma.entity.NomenclatureLocalization-13d8d92e-9a3b-dd17-70a7-23afab06dbaf [detached].
	at org.eclipse.persistence.internal.queries.EntityFetchGroup.onUnfetchedAttribute(EntityFetchGroup.java:98)
	at com.haulmont.cuba.core.sys.persistence.CubaEntityFetchGroup.onUnfetchedAttribute(CubaEntityFetchGroup.java:74)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.processUnfetchedAttribute(EntityManagerImpl.java:2846)
	at com.haulmont.chile.core.model.impl.AbstractInstance._persistence_checkFetched(AbstractInstance.java)
	at ru.infinnity.dma.entity.NomenclatureLocalization._persistence_get_isDefault(NomenclatureLocalization.java)
	at ru.infinnity.dma.entity.NomenclatureLocalization.getIsDefault(NomenclatureLocalization.java:52)
	at ru.infinnity.dma.entity.Nomenclature.getTargetLang(Nomenclature.java:145)
	at ru.infinnity.dma.entity.Nomenclature.getName(Nomenclature.java:120)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.haulmont.chile.core.model.utils.MethodsCache.invokeGetter(MethodsCache.java:71)
	at com.haulmont.chile.core.model.impl.AbstractInstance.getValue(AbstractInstance.java:102)
	at com.haulmont.cuba.core.entity.BaseGenericIdEntity.getValue(BaseGenericIdEntity.java:139)
	at com.haulmont.chile.core.model.utils.InstanceUtils.getInstanceName(InstanceUtils.java:235)
	at com.haulmont.chile.core.model.impl.AbstractInstance.getInstanceName(AbstractInstance.java:59)
	at com.haulmont.cuba.core.global.MetadataTools.format(MetadataTools.java:139)
	at com.haulmont.cuba.web.gui.data.PropertyWrapper.getFormattedValue(PropertyWrapper.java:149)
	at com.haulmont.cuba.web.gui.components.WebAbstractTable$TablePropertyWrapper.getFormattedValue(WebAbstractTable.java:2063)
	at com.haulmont.cuba.web.toolkit.ui.CubaTable.formatPropertyValue(CubaTable.java:268)
	at com.haulmont.cuba.web.toolkit.ui.CubaTable.getPropertyValue(CubaTable.java:228

Теперь нужно убедиться, что для NomenclatureLocalization нужные свойства включены в _minimal View (указаны в @NamePattern).

На практике, использование связанных сущностей в @NamePattern плохо влияет на производительность. Я бы рекомендовал денормализацию и хранение дополнительного строкового атрибута вместо получения больших графов из БД.

1 симпатия

Я пробовал включать недостающие атрибуты в view _minimal NomenclatureLocalization это не помогло.