双向@OneToMany和@ManyToOne - 从集合中删除子项而不从数据库中删除的正确方法是什么



假设我有两个映射的实体,字段和集群。我想从字段中删除映射集群之一,而不从数据库中删除此集群。最好的方法是什么?

字段.java

@Entity
@Table(name = "field")
public class Field extends Base {
...
@OneToMany(mappedBy = "field", fetch = FetchType.LAZY)
private List<Cluster> clusters = new ArrayList<>();

集群.java

@Entity
@Table(name = "cluster")
public class Cluster extends Base {
....
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "field_id")
private Field field;

现在我必须做这样的事情:

public FieldOutDto save(FieldInDto createRequest) {
Field newField = new Field();
modelMapper.map(createRequest, newField);
setClusters(newField, createRequest);
return modelMapper.map(fieldRepository.save(newField), FieldOutDto.class);
}
public FieldOutDto update(String id, FieldInDto updateRequest) {
Field fromDb = fieldRepository.findById(UUID.fromString(id)).orElseThrow(EntityNotFoundException::new);
modelMapper.map(updateRequest, fromDb);
clusterRepository.findAllByField_Id(UUID.fromString(id)).forEach(cluster -> cluster.setField(null));
setClusters(fromDb, updateRequest);
return modelMapper.map(fieldRepository.save(fromDb), FieldOutDto.class);
}
public void delete(String id) {
findById(id).getClusters()
.forEach(cluster -> cluster.setField(null));
fieldRepository.deleteById(UUID.fromString(id));
}
private void setClusters(Field field, FieldInDto request) {
if (request.getClustersUuid() != null && !request.getClustersUuid().isEmpty()) {
field.setClusters(request.getClustersUuid().stream()
.map(id -> {
Cluster cluster = clusterRepository.findById(UUID.fromString(id)).orElseThrow(EntityNotFoundException::new);
cluster.setField(field);
return cluster;
})
.collect(Collectors.toList()));
} else {
field.setClusters(Collections.EMPTY_LIST);
}
}

我试图找到一种方法在没有更新的情况下获得相同的结果

clusterRepository.findAllByField_Id(UUID.fromString(id)).forEach(cluster -> cluster.setField(null));

和在删除方法中

findById(id).getClusters()
.forEach(cluster -> cluster.setField(null));

从集合中删除子项而不从数据库中删除的方法之一是创建实用程序方法来在父(字段(类中添加或删除子项(群集(,如下所示。

@Entity
@Table(name = "field")
public class Field extends Base {
...
@OneToMany(mappedBy = "field", fetch = FetchType.LAZY)
private List<Cluster> clusters = new ArrayList<>();
public void addCluster(Cluster cluster) {
cluster.add(cluster);
cluster.setField(this);
}
public void removeCluster(Cluster cluster) {
cluster.remove(cluster);
cluster.setField(null);
}
}

然后,调用这些方法在父(字段(中添加或删除子(集群(,而无需提前将其从数据库中删除。

最新更新