删除元素时,使用 JoinTable 和 OrderColumn 的休眠单向 OneToy 映射中的约束冲突
2022-09-02 13:38:59
从如上所述映射的列表中删除元素时,我遇到了问题。下面是映射:
@Entity @Table( name = "foo") class Foo { private List bars; @OneToMany @OrderColumn( name = "order_index" ) @JoinTable( name = "foo_bar_map", joinColumns = @JoinColumn( name = "foo_id" ), inverseJoinColumns = @JoinColumn( name = "bar_id" ) ) @Fetch( FetchMode.SUBSELECT ) public List getBars() { return bars; } }
插入Bar实例并保存Foo工作正常,但是当我从列表中删除元素并再次保存时,违反了映射表中bar_id的唯一约束。以下 SQL 语句由休眠发出,这些语句看起来很奇怪:
LOG: execute : delete from foo_bar_map where foo_id=$1 and order_index=$2 DETAIL: parameters: $1 = '4', $2 = '6' LOG: execute S_5: update foo_bar_map set bar_id=$1 where foo_id=$2 and order_index=$3 DETAIL: parameters: $1 = '88', $2 = '4', $3 = '0' ERROR: duplicate key value violates unique constraint "foo_bar_map_bar_id_key"
考虑到Hibernate生成的语句,这个错误是完全有意义的(列表中有五个项目,我删除了第一个项目,Hibernate删除了带有LAST索引的映射行,并尝试更新其余的,从第一个开始)。
上面的映射有什么问题?