大家好,我有我的实体
@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“字段是否发生了变化,但我真的不喜欢这个解决方案。你在想什么?你有更好的方法或其他想法吗?
谢谢!
发布于 2018-06-07 17:26:58
在您的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() );
}https://stackoverflow.com/questions/50733867
复制相似问题