如何将@OrderColumn 与软删除一起使用

How to use @OrderColumn with soft delete

我有一个 class PostItemPostItemSigner。他们有一个一对多的关系。另外 class PostItemSigner 是软删除的,这意味着数据库中的记录永远不会被删除,只有一个标志被设置为真或假。

public class PostItem {

    // ...

    @OneToMany(mappedBy = "postItem", fetch = FetchType.EAGER)
    @OrderColumn(name = "sequence")
    private List<PostItemSigner> signers;

    // ...
}

public class PostItemSigner {

    // ... 

    @ManyToOne
    @JoinColumn(name = "post_item_id")
    private PostItem postItem;

    private boolean deleted;
    
    // ...
}

创建工作正常,我的所有记录都有一个序列号。现在我的更新遇到了一些问题。

我创建了 f.e。 4 个 postitemsigners 用于 1 个 postitem,在我的更新中我删除了其中的 2 个(setDeleted(true))

如何在保存到数据库时获得我的 2 个未删除的 postitemsigners,序列号为 0 和 1,以及我删除的 postitemsigners 序列号为 2 和 3。如果我添加一个新的 postitemsigner,我希望这个得到序列号 2 和删除的序列号 3 和 4 f.e..

我试过先保存未删除的,然后再保存删除的,但后来由于某种原因其中一些得到了相同的序列号。

编辑:

更新后,我使用了地图 Map<Long, PostItemSigner> 而不是列表 List<PostItemSigner>。地图将它们置于不同的顺序,而列表保持顺序。所以问题解决了!

您不能既减少序列号又不为某些项目设置相同的序列号。序列应该只在获取新值时增加。

软删除项不应出现在结果中,因为它们已被删除。但是如果你想使用某些软件或者取消删除它们,那么这个数字可能与你由于某些原因减少的当前序列号不一致。

要消除不一致,您应该更新未删除项目的序列号。如果您更新已删除的项目,则删除旧的序列号。

这类似于您想创建没有父引用的孤儿,因为父引用已被删除。请注意,如果父级违反了外键约束,则不能将其删除。