Не выбрасывается EntityChangedEvent если есть кастомный DataType

Добрый день.

Для сущности Assignment не выбрасывается событие EntityChangedEvent при редактировании (при создании выбрасывается).

@JmixEntity
@Table(name = "U1_ASSIGNMENT")
@Entity(name = "u1_Assignment")
public class Assignment {

    @JmixGeneratedValue
    @Id
    @Column(name = "ID", nullable = false)
    private UUID id;

    @NotNull
    @Column(name = "NUMBER_", nullable = false)
    private Long number = 1L;

    @NotNull
    @Column(name = "TEXT_", nullable = false)
    private String text;

    @Column(name = "FLAGS", columnDefinition = "varchar(512)")
    private AssignmentFlag[] flags;

    // getters and setters
}

Я сделал AssignmentEventListener для проверки. Можно в консоль вывод смотреть, можно точку останова поставить и убедиться,
что в слушатель не заходит.

Выяснил, что за генерацию этих событий отвечает компонент io.jmix.eclipselink.impl.EntityChangedEventManager
и, конкретно, в методе internalCollect есть такие строки:

public List<EntityChangedEventInfo> internalCollect(Collection<Object> entities) {
    //
    AttributeChangeListener changeListener =
            (AttributeChangeListener) ((ChangeTracker) entity)._persistence_getPropertyChangeListener();
    if (changeListener == null) {
        log.debug("Cannot publish EntityChangedEvent for {} because its AttributeChangeListener is null", entity);
        continue;
    }
    if (persistenceSupport.isDeleted(entity, changeListener)) {
        type = EntityChangedEvent.Type.DELETED;
        attributeChangesBuilder = getEntityAttributeChanges(entity, true);
    } else if (changeListener.hasChanges()) {
        type = EntityChangedEvent.Type.UPDATED;
        attributeChangesBuilder = getEntityAttributeChanges(entity, changeListener.getObjectChangeSet());
    }
    //
}

И для Assignment вызов (AttributeChangeListener) ((ChangeTracker) entity)._persistence_getPropertyChangeListener()
возвращает null и дальнейшая проверка завершает цикл и событие EntityChangedEvent для этой сущности не создаётся.

У Assignment есть атрибут AssignmentFlag[] flags и кастомный DataType AssignmentFlagDataType.
Вроде всё сделано по инструкции. Но именно из-за этого атрибута происходит, то что происходит.
То есть, если убрать этот атрибут у сущности Assignment, то событие начнёт выбрасываться,
потому что _persistence_getPropertyChangeListener() уже будет возвращать что-то, а не null.

Вот код этого DataType. Сделан по аналогии с другими.

@Internal
@DatatypeDef(id = "assignmentFlagArray", javaClass = AssignmentFlag[].class, defaultForClass = true, value = "u1_AssignmentFlagDataType")
public class AssignmentFlagDataType implements Datatype<AssignmentFlag[]> {

    @Nonnull
    @Override
    public String format(@Nullable Object value) {
        if (value instanceof AssignmentFlag[]) {
            return Stream.of((AssignmentFlag[]) value)
                    .map(AssignmentFlag::getId)
                    .collect(Collectors.joining(","));
        }
        return "";
    }

    @Nonnull
    @Override
    public String format(@Nullable Object value, Locale locale) {
        return format(value);
    }

    @Nullable
    @Override
    public AssignmentFlag[] parse(@Nullable String value) throws ParseException {
        if (value == null || value.length() == 0) {
            return null;
        }

        return Stream.of(value.split(","))
                .map(AssignmentFlag::fromId)
                .filter(Objects::nonNull)
                .toArray(AssignmentFlag[]::new);
    }

    @Nullable
    @Override
    public AssignmentFlag[] parse(@Nullable String value, Locale locale) throws ParseException {
        return parse(value);
    }

    @Override
    public String toString() {
        return getClass().getSimpleName();
    }

}

Отдельного экрана для редактирования Assignment я не делал, описанное выше поведение воспроизводится и при редактировании через инспектор сущностей.

Приложил демо. Gradle настроен на наши локальные репозитории, нужно будет поправить.
untitled1.zip (85.9 КБ)

Сам спросил, сам отвечу.

Забыл сделать конвертер для AssignmentFlag[] из-за этого всё ломалось. Странно, правда, что это в таком поведении выражается.

1 симпатия