Попытка избежать срабатывания JPA EntityListeners для отношения OneToMany - PullRequest
0 голосов
/ 07 июня 2018

Привет, у меня есть моя сущность

@Entity
@Getter
@Setter
@EntityListeners(TaskInfoEntityListener.class)
public class TaskInfo extends Auditable {

    @Id
    private String taskId;

    ...

    @OneToMany(mappedBy = "task", orphanRemoval = true, fetch = FetchType.EAGER)
    private List<TaskComment> comments;
}

И когда я запускаю этот кусок кода

final TaskInfo taskInfo = new TaskInfo();
taskInfo.setTaskId("1234");

final TaskComment taskComment = new TaskComment();
taskComment.setComment("comment_1234");
taskInfo.setComments(Collections.singletonList(taskComment));

TaskInfo newTaskInfo = taskInfoRepository.save(taskInfo);

EntityListener запускается дважды (первый, когда сохраняется TaskInfoи второй, когда комментарии сохраняются), но я хочу один раз (только в первый раз).Я попробовал все с извлечением и каскадом с обеих сторон, но я не могу заставить его работать.Я также подумал о том, чтобы поместить некоторую логику в TaskInfoEntityListener, чтобы проверить, изменилось ли поле «комментарии», но мне не очень нравится это решение.Что ты думаешь?У вас есть лучший подход или другая идея?

Спасибо!

1 Ответ

0 голосов
/ 07 июня 2018

В вашем EntityListener попробуйте предоставить прослушиватели жизненного цикла для каждого шага и посмотрите, что вызывается.скорее всего вас зовут на разные события.(может быть, сохранить и обновить?)

@PrePersist
public void methodInvokedBeforePersist(TaskInfo ti) {
    System.out.println("persisting TaskInfo with id = " + ti.getTaskId());
}

@PostPersist
public void methodInvokedAfterPersist(TaskInfo ti) {
    System.out.println("Persisted TaskInfo with id = " + ti.getTaskId());
}

@PreUpdate
public void methodInvokedBeforeUpdate(TaskInfo ti) {
    System.out.println("Updating TaskInfo with id = " + ti.getTaskId());
}

@PostUpdate
public void methodInvokedAfterUpdate(TaskInfo ti) {
    System.out.println("Updated TaskInfo with id = " + ti.getTaskId());
}

@PreRemove
private void methodInvokedBeforeRemove(TaskInfo ti) {
    System.out.println("Removing TaskInfo with id = " + ti.getTaskId());
}

@PostRemove
public void methodInvokedAfterRemove(TaskInfo ti) {
    System.out.println("Removed TaskInfo with id = " + ti.getTaskId() );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...