在保留父数据的同时尝试 delete/update 个子元素

Trying to delete/update child elements while keeping parent data

我在一条链中有 3 个 table,最上面的是 'Corridor' @Entity,最下面的是 Segment @Entity,中间的通过 @JoinTable 创建,另外两个 table 中的 id 列之间具有 ManyToMany 关系。这个叫做CorridorSegments

我正在尝试找到一种方法来保留走廊数据,并删除数据库中与 corridor 行相关的所有 segments 行和 corridor_segments 行.然后我打算更换它们。所以这几乎是一个更新过程,将原始数据保留在顶部 'corridor' table 并将其链接到新条目。

@Entity
@Table(name = "corridor")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "corridor")
public class Corridor implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(name = "text_identifier", nullable = false)
    private String textIdentifier;

    @ManyToOne
    private Jurisdiction jurisdiction;
    //etc., etc., getters, setters, constructors, basic Entity class
}
@Entity
@Table(name = "segment")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Segment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(name = "sequence", nullable = false)
    private Long sequence;


    @NotNull
    @Column(name = "name", nullable = false)
    private String name;
    //etc., etc., getters, setters, constructors, basic Entity class
}
@ManyToMany(cascade = {CascadeType.ALL}, fetch=FetchType.EAGER)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "corridor_segments",
        joinColumns = @JoinColumn(name="corridor_id", referencedColumnName="id"),
        inverseJoinColumns = @JoinColumn(name="segment_id", referencedColumnName="id"))
    private Set<Segment> segments = new HashSet<>();

我可以通过扩展 JPARepository 接口的存储库 class 将新条目保存到段 table,使用简单的 segmentRepository.save(segment); 但是当我尝试使用内置 segmentRepository.delete();,没用。

我认为这可能是因为我需要在删除生效之前分离关系,或者更改中间 table 的结构,但我不确定。

关于如何删除 table 中的数据并替换它们有什么建议吗?感谢您的帮助!

加载要删除其所有 Segment 条目的 Corridor

从中迭代引用的 Segment 个实例。 对于每个 on,您需要将其从它所在的所有 Corridor 个实例中删除。 所以不再引用。 然后,您可以使用 delete 操作将其删除 SegementRepository.