具有一对多关系的保存实体将覆盖数据库更改或相关实体

时间:2018-11-06 11:17:10

标签: java spring hibernate spring-boot jpa

我已经创建了一个实体DownloadDroplet,其中包含对Process的ManyToOne引用

@ManyToOne
@JoinColumn(name = "process_id")
private Process process;

并使用对DownloadDroplet的一对多引用

@OneToMany(fetch = FetchType.EAGER, mappedBy = "process", cascade = CascadeType.ALL)
private Set<DownloadDroplet> downDrops;

我有从 dropletRepo 获取DownloadDroplets并最终将更新保存并刷新到数据库的代码,这些更新我从视觉上确认是在数据库中更新的。

Set<DownloadDroplet> aDownDropSetCompleted = dropletRepo.findByStatusAndRunDateAndType(DropletStatus.COMPLETED, runDateAsDate, FBTDropletType.SETDOWNLOADER);

...

然后我保存进程的状态

 setProcess.setStatus(ProcessStage.GETTINGPRODUCTS);
 processRepo.saveAndFlush(setProcess);

,这将使用dropletRepo覆盖保存到该数据库的更改,从而有效地撤消先前保存到数据库的更改。

所以我认为是因为DownloadDroplets与Process有关系,并且在保存了我遇到的问题的downloaddroplet之后正在保存进程。

如何避免此问题?

问候 继续

1 个答案:

答案 0 :(得分:2)

最有可能您必须对Process实体进行合并,然后才能对其进行更改。

这将使用先前持久保存到上下文的状态刷新状态。

由于cascade = CascadeType.ALL批注上的@OneToMany已经具有级联合并,因此它将传播到列表中的所有DownloadDroplet实体。