Добрый день.
Для сущности 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 КБ)