我已经创建了一个实体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之后正在保存进程。
如何避免此问题?
问候 继续
答案 0 :(得分:2)
最有可能您必须对Process
实体进行合并,然后才能对其进行更改。
这将使用先前持久保存到上下文的状态刷新状态。
由于cascade = CascadeType.ALL
批注上的@OneToMany
已经具有级联合并,因此它将传播到列表中的所有DownloadDroplet
实体。