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”字段是否发生了变化,但我不太喜欢这个解决方案。 你做什么的?你有更好的方法或任何其他想法吗?
谢谢!
答案 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() );
}