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

问题描述 投票:0回答:1

假设我有两个映射的实体,即Field和Cluster,我想从Field中删除其中一个映射的Cluster,而不从数据库中删除这个Cluster。我想从字段中删除其中一个映射的簇,而不从数据库中删除这个簇。什么是最好的方式来做到这一点?

Field.java

@Entity
@Table(name = "field")
public class Field extends Base {

...

@OneToMany(mappedBy = "field", fetch = FetchType.LAZY)
private List<Cluster> clusters = new ArrayList<>();

Cluster.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);
    }
}

我试着想办法在UPDATE中不出现同样的结果。

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

和DELETE方法中

findById(id).getClusters()
           .forEach(cluster -> cluster.setField(null));
spring hibernate jpa one-to-many many-to-one
1个回答
0
投票

从集合中删除一个子集而不从数据库中删除的方法之一是通过在你的Parent(Field)类中创建实用的方法来添加或删除子集(Cluster),如下所示。

@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);
  }
}

然后你调用这些方法从父类(Field)中添加或删除一个子类(Cluster),而不需要事先从DB中删除它。

© www.soinside.com 2019 - 2024. All rights reserved.