Добрый день!
Когда пользователь изменяет код динамического Атрибута CategoryAttribute.code, то код Значения динамического атрибута остается прежним CategoryAttributeValue.code. Такое поведение приводит к множественным Значениям динамических атрибутов (дублям) и к некорректной их работе.
описание некорректной работы
Сценарий:
*предварительное условие - в приложение добавлены динамические атрибуты и их значения.
- Открыть экран редактирования динамического Атрибута и изменить код;
- Сохранить изменения и применить (Кнопка применить изменения на списочном экране Категорий);
- Отрыть окно редактирования сущности, для которой добавлен динамический атрибут и существует значение, и изменить его значение;
При этом в базу данных добавляется повторное Значение (связанное с тем же category_attr_id и той же entity_id), но с новым кодом.
Если упорядочить эти Значения по id и то, что новое будет после старого, то при отображении на экране редактирования сущности будет отображаться всегда старое Значение атрибута, а при попытке изменить, значение будет меняться в новом.
В некоторых случаях Значения продолжают множиться дальше.
Все это было обнаружено в мигрированных с CUBA проектов, где коды Атрибутов могли быть на кириллице, а скриптов миграции Значений и Атрибутов не предусмотрено.
обходное решение
Для себя мы реализовали такое решение. Оно не предотвращает от появления дублей, а просто при перезапуске приложения мигрирует коды Атрибутов и Значений, и корректно удаляет дубли оставляя последнее значение для атрибута, которое пытались установить.
@EventListener(ApplicationReadyEvent.class)
public void migrateDynamicAttributes(){
log.debug("Migration dynamic attributes started");
systemAuthenticator.runWithSystem(() -> {
//удаление повторных значений динамических атрибутов.
this.deleteDuplicateCategoryAttributeValue();
//миграция кодов динамических атрибутов.
this.migrateCategoryAttribute();
//миграция кодов значений динамических атрибутов.
this.migrateCategoryAttributeValue();
//очистить кэш
dynAttrMetadata.reload();
});
log.info("Dynamic attributes migrated");
}
обстановка
Jmix version: 1.7.1
Jmix Studio Plugin Version: 2.6.4-252
IntelliJ version: IntelliJ IDEA 2025.2 (Community Edition)
implementation “io.jmix.cuba:jmix-cuba-starter”

