JPA软删除场景下如何正确使用@OrderColumn维护关联集合排序
JPA @OrderColumn 软删除场景下序列重复问题
我有两个存在一对多关联的类:PostItem和PostItemSigner,其中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; // ... }
问题现象
创建功能运行正常,所有记录都能分配到正确的sequence序号,但更新操作出现问题。
示例场景:为一个PostItem创建了4条PostItemSigner记录,更新时将其中2条标记为删除(执行setDeleted(true))。
预期效果:保存到数据库后,2条未删除的PostItemSigner的sequence值为0和1,已删除的2条为2和3;如果新增一条PostItemSigner,新增记录的sequence应为2,已删除的两条顺延为3和4。
实际问题:尝试过先保存未删除记录、再保存已删除记录,但部分记录出现了重复的sequence值。
根因与解决
最终排查发现问题出在更新时使用了Map<Long, PostItemSigner>而非List<PostItemSigner>存储数据,Map无法保持元素顺序,导致JPA在根据集合顺序生成sequence值时出现混乱。改用有序的List存储并保留元素顺序后问题解决。
内容的提问来源于stack exchange,提问作者terrinizer
相关产品推荐
相关产品推荐

