oman
(Oleg SmaLL)
21.Сентябрь.2022 09:05:46
1
Коллеги, добрый день!
Подскажите, пожалуйста, как избавится от этой ошибки “IllegalStateException: Cannot get unfetched attribute [name] from detached object ”?
Пример проекта:
IllegalStateException.zip (96.1 КБ)
Описание проблемы:
В слушателе события EntitySavingEvent создается другая ссылочная сущность и добавляется в поле создаваемой:
@EventListener
public void onNewEntitySaving(EntitySavingEvent<NewEntity> event) {
NewEntity entity = event.getEntity();
NewEntityRef entityRef = dataManager.create(NewEntityRef.class);
entityRef.setName("test-" + System.currentTimeMillis());
dataManager.save(entityRef);
entity.setMyRef(entityRef);
}
Ошибка возникает при добавлении сущности NewEntity через gui, т.е. при нажатии Ок в диалоге редактирования сущности.
Я так понимаю, надо как-то перезагрузить созданную сущность в dataset.
1 лайк
krivopustov
(Konstantin Krivopustov)
23.Сентябрь.2022 07:38:33
3
Олег,
Спасибо за сообщение о проблеме и за тестовый проект.
Создан тикет:
открытые 07:34AM - 23 Sep 22 UTC
закрытые 12:21PM - 03 Oct 22 UTC
type: bug
The following case leads to `IllegalStateException: Cannot get unfetched attribu… te ...` exception:
- Creating a new entity instance
- The entity has a reference which is null in the edit screen
- The reference is set by an entity listener when saving the root entity
In the test project, try to create "New entity" and not set the reference:
[IllegalStateException.zip](https://github.com/jmix-framework/jmix/files/9631553/IllegalStateException.zip)
The problem is gone if the fetch plan is specified explicitly:
```
@Install(target = Target.DATA_CONTEXT)
private Set<Object> commitDelegate(SaveContext saveContext) {
saveContext.getFetchPlans().put(getEditedEntity(), getEditedEntityContainer().getFetchPlan());
return dataManager.save(saveContext);
}
```
Originated from [forum](https://forum.jmix.ru/t/illegalstateexception-cannot-get-unfetched-attribute-name-from-detached-object/593).
Обходной путь - надо создать commitDelegate и в нем добавить актуальный fetchPlan для редактируемой сущности:
@Install(target = Target.DATA_CONTEXT)
private Set<Object> commitDelegate(SaveContext saveContext) {
saveContext.getFetchPlans().put(getEditedEntity(), getEditedEntityContainer().getFetchPlan());
return dataManager.save(saveContext);
}
С уважением,
Константин
2 лайка