tbk*_*tbk 16 java hibernate jpa one-to-many jpa-2.0
从上面描述的映射中删除元素时遇到问题.这是映射:
@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-instances并保存Foo工作正常,但是当我从列表中删除元素并再次保存时,违反了映射表中bar_id的唯一约束.以下SQL语句是由hibernate发布的,这看起来很奇怪:
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索引的映射行,并尝试更新剩余的那些,从第一个开始) .
上面的映射有什么问题?
Pas*_*ent 15
您的映射完全有效,并且作为JPA 2.0实现与EclipseLink一起使用(Fetch当然没有注释),但实际上Hibernate失败了.
这是带有Hibernate的DDL:
create table foo_bar_map (foo_id bigint not null, bar_id bigint not null, order_index integer not null, primary key (foo_id, order_index), unique (bar_id))
alter table foo_bar_map add constraint FK14F1CB7FA042E82 foreign key (bar_id) references Bar4022509
alter table foo_bar_map add constraint FK14F1CB7B6DBCCDC foreign key (foo_id) references Foo4022509
Run Code Online (Sandbox Code Playgroud)
所以我们可以说Foo#1保持了与列表Bar#1,Bar#2,Bar#3,连接表包括:
foo_id | bar_id | order_index
1 | 1 | 1
1 | 2 | 2
1 | 3 | 3
Run Code Online (Sandbox Code Playgroud)
当删除时,比如列表中的第一项,Hibernate首先delete从连接表中最后一行(WTF?):
foo_id | bar_id | order_index
1 | 1 | 1
1 | 2 | 2
Run Code Online (Sandbox Code Playgroud)
然后尝试连接表中update的bar_id列而不是order_index(WTF!?)以反映列表中项目的"新"排序.首先(示意图):
foo_id | bar_id | order_index
1 | 2 | 1
1 | 2 | 2
Run Code Online (Sandbox Code Playgroud)
下一步将导致:
foo_id | bar_id | order_index
1 | 2 | 1
1 | 3 | 2
Run Code Online (Sandbox Code Playgroud)
显然,这种方法听起来不对,因为受到限制而无效.更一般地说,为什么Hibernate会干扰而不是更新列呢?uniquebar_idbar_idorder_index
我认为这是一个Hibernate错误(报告为HHH-5694,现在参见HHH-1268).
| 归档时间: |
|
| 查看次数: |
12370 次 |
| 最近记录: |