gpt4 book ai didi

java - 设置实体数据添加到现有数据,而不是替换补丁请求上的所有现有值

转载 作者:行者123 更新时间:2023-12-02 01:54:38 25 4
gpt4 key购买 nike

我的 ObjectServiceService 中有此代码。每次我发送补丁请求时,它都会添加到现有项目中,然后会有重复项。

例如,一开始我有项目 A、B、C。我发送了一个补丁请求,其中已删除了 ObjectServiceJob“C”,因此该请求将包含 A 和 B。请求通过后,新项目为 A ,B,C,A,B。

此外,添加实体时也会发生同样的情况。如果我有 A、B,然后添加 C,则列表将变为 A、B、A、B、C。

我真的不明白为什么要这样做,这是我的应用程序中唯一没有按照我希望的方式工作的地方。

public ObjectService modifyObjectService(PatchObjectServiceRequest request, Long id){
ObjectService objectService = getObjectServiceById(id);
objectService.createSnapshot();
ObjectService editedObjectService = this.setObjectServiceData(request, getObjectServiceById(id));
if (objectService.hasSnapshot()) {
Map<String, SnapshotEntity.Change> changes = objectService.detectChanges();
logService.saveLogTypeUpdate(editedObjectService, changes);
}
return editedObjectService;
}

public ObjectService setObjectServiceData(PatchObjectServiceRequest request, ObjectService objectService) {

if (request.getObjectServiceJobs() != null) {
objectServiceRepository.save(objectService);
List<ObjectServiceJob> objectServiceJobs = new ArrayList<>();
request.getObjectServiceJobs().forEach(serviceJob -> {
ObjectServiceJob objectServiceJob = new ObjectServiceJob();
objectServiceJob.setObjectService(objectService);
objectServiceJob.setJob(serviceJob.getJob());
objectServiceJob.setWorkDetail(serviceJob.getWorkDetail());
objectServiceJobRepository.save(objectServiceJob);
objectServiceJobs.add(objectServiceJob);
});
objectService.setObjectServiceJobs(objectServiceJobs);
}
return objectServiceRepository.save(objectService);
}

这就是 ObjectService 实体包含 ObjectServiceJobs 的方式:

@OneToMany(mappedBy = "objectService")
@SnapshotIgnored
private List<ObjectServiceJob> objectServiceJobs;

这是 ObjectServiceJob 实体:

@Entity
@Data
@NoArgsConstructor
@Table(name = "object_service_job")
public class ObjectServiceJob extends SnapshotEntity implements SnapshotCompatible {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false, columnDefinition = "serial")
private Long id;

@ManyToOne
@JoinColumn(name = "object_service_id", nullable = false)
@JsonIgnore
private ObjectService objectService;

@ManyToOne
@JoinColumn(name = "job_id", nullable = false)
private Job job;

@ManyToOne
@JoinColumn(name = "work_detail_id")
private WorkDetail workDetail;

@Override
public String getSnapshotString() {
return job.getName();
}
}

最佳答案

我想说,您需要做的不仅仅是创建一个新列表并期望 JPA 为您自动删除、更新所有内容。

我想说你需要迭代现有的objectServiceJobs并检查:

1) 如果是新的,则:将作业添加到列表中并在其 ManyToOne 关联上设置 objectService

2) 如果不再存在:从列表中删除作业并将其 ManyToOne 关联上的 objectService 设置为 NULL。

3) 如果作业已存在并且应保留在列表中,则只需调用 save() 传递作业即可更新其数据。

关于java - 设置实体数据添加到现有数据,而不是替换补丁请求上的所有现有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57406235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com