PreUpdate вызван, но дочерняя сущность коллекции не сохранена - PullRequest
0 голосов
/ 23 марта 2019

У меня есть проект 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 и работала как ожидалось

1 Ответ

1 голос
/ 24 марта 2019

Обратите внимание, что в соответствии со спецификацией JPA вы должны использовать только прослушиватели сущностей для изменения состояния несвязанности сущности .

Попытка сделать что-либо кроме этого приводит к неопределенному поведению.Это может или не может работать, и это может также сломаться в любое время.Не ожидайте авторитетных ответов о том, почему ваш конкретный случай также не работает, поскольку попытка добавить сущности в прослушиватель уже является своего рода хаком и не гарантированно сработает.

Вы были предупреждены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...