Hibernate 集合上[update,delete]的休眠顺序打破了DB约束。如何修复?

Hibernate 集合上[update,delete]的休眠顺序打破了DB约束。如何修复?,hibernate,orm,Hibernate,Orm,当从集合中间删除元素时,Hibernate会导致合并包含有序集合的对象时出现问题 一些背景:我正在开发一个生成CSV报告的工具。在我的模型中,我希望报表对象具有列对象,其顺序由column.orderIndex int值决定 当我删除orderIndex不是列表中最后一个的列时,问题就出现了。执行merge()时,Hibernate运行以下SQL: updatereport\u COLUMNS set[…],orderIndex=1,其中pkey=2——这以前是第2列,现在它的orderInde

当从集合中间删除元素时,Hibernate会导致合并包含有序集合的对象时出现问题

一些背景:我正在开发一个生成CSV报告的工具。在我的模型中,我希望报表对象具有列对象,其顺序由column.orderIndex int值决定

当我删除orderIndex不是列表中最后一个的列时,问题就出现了。执行merge()时,Hibernate运行以下SQL:

updatereport\u COLUMNS set[…],orderIndex=1,其中pkey=2——这以前是第2列,现在它的orderIndex将与第1列的orderIndex冲突
从pkey=1的报告_列中删除--这是要删除的第一列
如果Hibernate先运行删除,就不会有问题

以下是集合的声明方式:

@OneToMany(fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@OrderBy("orderIndex")
@JoinColumn(name = "report", updatable = true, insertable = true, nullable = false)
@Cascade({ org.hibernate.annotations.CascadeType.DELETE,
    org.hibernate.annotations.CascadeType.DELETE_ORPHAN,
    org.hibernate.annotations.CascadeType.MERGE,
    org.hibernate.annotations.CascadeType.PERSIST,
    org.hibernate.annotations.CascadeType.REMOVE,
    org.hibernate.annotations.CascadeType.SAVE_UPDATE })
public List<ReportColumnImpl> getColumnImpls() {
    return columns;
}
@OneToMany(fetch=FetchType.EAGER)
@Fetch(值=FetchMode.SUBSELECT)
@OrderBy(“orderIndex”)
@JoinColumn(name=“report”,updateable=true,insertable=true,nullable=false)
@级联({org.hibernate.annotations.CascadeType.DELETE,
org.hibernate.annotations.CascadeType.DELETE_孤儿,
org.hibernate.annotations.CascadeType.MERGE,
org.hibernate.annotations.CascadeType.PERSIST,
org.hibernate.annotations.CascadeType.REMOVE,
org.hibernate.annotations.CascadeType.SAVE_UPDATE})
公共列表getColumnImpls(){
返回列;
}

非常感谢您的帮助。

最简单的解决方案是推迟约束,即仅在事务结束时检查约束。Oracle支持延迟约束。不知道你的数据库


否则,您可以删除要删除的实体,然后刷新会话,然后更新orderIndexes。但是,如果Hibernate在更新第三个元素的索引之前尝试更新第四个元素的索引,您可能也会遇到问题。

是否需要更新orderindex

如果删除1个或多个元素,则此整数集合(1、2、3、4、5、6、7)仍然可以按相同顺序排序。 e、 g

(1,2,5,7)


如果您确实需要维护一个顺序,为什么不创建一个ReportColumn来存储对下一列和上一列的引用(非常类似于链表),然后在删除其中一列时更新其两侧的元素?

谢谢JB-我正在使用Oracle,将尝试一下