Добрый день.
JMIX 1.7.1
Ниже описал ситуацию, с которой я столкнулся в реальном проекте.
Для ассоциации @OneToOne(mappedBy)
в EntityChangedEvent
в качестве oldValue загружается мягко удалённая сущность (удалённая не в текущей транзакции а когда-либо ранее).
Есть две сущности в которых нас интересует ассоциация между ними:
@JmixEntity
@Table(name = "SD_ASSIGNMENT")
@Entity(name = "sd_Assignment")
public class Assignment {
@OneToOne(mappedBy = "assignment", fetch = FetchType.LAZY)
private Step step;
}
@JmixEntity
@Table(name = "SD_STEP")
@Entity(name = "sd_Step")
public class Step {
@DeletedBy
@Column(name = "DELETED_BY")
private String deletedBy;
@Temporal(TemporalType.TIMESTAMP)
@DeletedDate
@Column(name = "DELETED_DATE")
private Date deletedDate;
@NotNull
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ASSIGNMENT_ID", nullable = false, updatable = false)
private Assignment assignment;
}
Так же есть обработчик события:
@EventListener
public void onAssignmentChangedBeforeCommit(final EntityChangedEvent<Assignment> event) {
final AttributeChanges changes = event.getChanges();
System.out.println(changes.getAttributes());
}
Последовательность действий:
- Создать
Assignment
- Создать
Step
(и привязать его кAssignment
) - Отредактировать
name
уAssignment
и увидеть в обработчике (EntityChangedEvent<Assignment>
) что изменился толькоname
. - Удалить
Step
. - Создать новый
Step
и привязать его к тому жеAssignment
. Тут у нас получается два экземпляраStep
, которые связаны сAssignemnt
, но один из них мягко удалён. - Отредактировать
name
уAssignment
и увидеть в обработчике (EntityChangedEvent<Assignment>
) что изменился НЕ толькоname
, но иstep
. И если посмотреть дебагером в changes, то увидим что дляstep
вoldValue
будет удалённыйstep
.
soft-deleted.zip (98.9 КБ)