Код Значения не изменяется при изменении кода Атрибута

Добрый день!

Когда пользователь изменяет код динамического Атрибута CategoryAttribute.code, то код Значения динамического атрибута остается прежним CategoryAttributeValue.code. Такое поведение приводит к множественным Значениям динамических атрибутов (дублям) и к некорректной их работе.

описание некорректной работы

Сценарий:

*предварительное условие - в приложение добавлены динамические атрибуты и их значения.

  1. Открыть экран редактирования динамического Атрибута и изменить код;
  2. Сохранить изменения и применить (Кнопка применить изменения на списочном экране Категорий);
  3. Отрыть окно редактирования сущности, для которой добавлен динамический атрибут и существует значение, и изменить его значение;

При этом в базу данных добавляется повторное Значение (связанное с тем же 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”

Здравствуйте! Спасибо большое за предоставленную информацию. Проблема с сохранением нескольких объектов CategoryAttributeValue, действительно, наблюдается. Уточните, пожалуйста, что вы имеете в виду, когда вы пишете “Если упорядочить эти Значения по id и то, что новое будет после старого”? Речь идёт о каком-то проектном экране с собственной логикой загрузки значений динамических атрибутов, или имеется в виду стандартное поведение компонента?

1 симпатия

Не все атрибуты работают некорректно при изменении кода. Когда мы искали причину такого поведения, то заметили, что если отсортировать все дублированные значения по id и первым в отсортированном списке будет значение с новым кодом, то тогда с ним все хорошо (он верно отображается и сохраняется). А если первым будет значение со старым - то работают такие значения неверно. Сортировку делали для данных в pgAdmin. :slight_smile:

И да - отображаем динамические атрибуты стандартным компонентом (фасет в дескрипторе экрана). :slightly_smiling_face:

Проблему обнаружили. Завели задачу для исправления. A problem with the dynamic attribute code changing (backport to 1.x) · Issue #4862 · jmix-framework/jmix · GitHub

Ещё раз спасибо большое за предоставленную информацию!