试图避免JPA EntityListeners触发OneToMany关系

时间:2018-06-07 05:56:25

标签: java jpa spring-data

Hellos人,我有我的实体

@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时的第一个,保存注释时的第二个),但我想要一次(仅第一次)。 我已经尝试了双方的fetch和cascade,但是我无法让它工作。我还想在TaskInfoEntityListener中加入某种逻辑来检查“comments”字段是否发生了变化,但我不太喜欢这个解决方案。 你做什么的?你有更好的方法或任何其他想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

在您的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() );
}