У меня есть проект Spring, который использует lombok и аннотированный класс JPA, определенный следующим образом:
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity(name = "workflow_step")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "workflow_step_type")
@SuperBuilder
public abstract class BaseWorkflowStep extends BaseEntity {
@OneToMany(mappedBy = "step", cascade = CascadeType.PERSIST)
protected List<WorkflowEvent> events = Collections.synchronizedList(new ArrayList());
@PreUpdate
public void onPreUpdate() {
if (completed == true) {
System.out.println("Event added!!!\n\n\n\n\n\n");
events.add(WorkflowEvent.builder().workflow(workflow).step(this).eventType(WorkflowEventType.STEP_COMPLETED).build());
}
if (workflow.isCompleted()) {
System.out.println("Event added!!!\n\n\n\n\n\n");
events.add(WorkflowEvent.builder().workflow(workflow).step(this).eventType(WorkflowEventType.COMPLETED)
.build());
}
}
В моих тестах всегда вызывается метод PreUpdate, но по какой-то причине, когда я отлаживаю его, он фактически генерирует вставки в таблицу событий следующим образом:
Hibernate:
/* insert eu.hnpgroup.icare.model.WorkflowEvent
*/ insert
into
workflow_event
(created, by_id, event_type, step_id, text, workflow_id)
values
(?, ?, ?, ?, ?, ?)
Но когда я просто запускаю его, это не так, и стол остается чистым.
В обоих случаях вывод печатается, но только при отладке он действительно работает.
Уже проверили PreUpdate не запускается при добавлении в коллекцию и подобных сообщений, но в моем случае метод на самом деле вызывается, только в том, что он ничего не хранит.
Стоит отметить, что у меня есть другая сущность с похожей коллекцией только для того, чтобы она сохраняла значение в prePersist и работала как ожидалось