当前位置: 首页 > 面试题库 >

删除元素时使用JoinTable和OrderColumn在Hibernate单向OneToMany映射中违反约束

曾成天
2023-03-14
问题内容

从如上所述映射的列表中删除元素时出现问题。这是映射:

@实体
@Table(name =“ foo”)
Foo类{

    私人列表栏;

    @OneToMany
    @OrderColumn(name =“ order_index”)
    @JoinTable(name =“ foo_bar_map”,joinColumns = @JoinColumn(name =“ foo_id”),inverseJoinColumns = @JoinColumn(name =“ bar_id”)))
    @Fetch(FetchMode.SUBSELECT)
    公共列表getBars(){
        回条
    }
}

插入Bar实例并保存Foo效果很好,但是当我从列表中删除一个元素并再次保存时,映射表中对bar_id的唯一约束被违反。以下SQL语句是由hibernate发出的,这些看起来很奇怪:

日志:执行:从foo_bar_map中删除,其中foo_id = $ 1和order_index = $ 2
详细信息:参数:$ 1 ='4',$ 2 ='6'
日志:执行S_5:更新foo_bar_map设置bar_id = $ 1,其中foo_id = $ 2和order_index = $ 3
详细信息:参数:$ 1 ='88',$ 2 ='4',$ 3 ='0'
错误:重复的键值违反了唯一约束“ foo_bar_map_bar_id_key”

考虑到Hibernate生成的语句,该错误完全有意义(列表中有五个项目,我删除了第一个项目,Hibernate删除了具有LAST索引的映射行,并尝试从第一个开始更新其余的行)

上面的映射有什么问题?


问题答案:

您的映射是完全有效的,并且可以作为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

所以我们可以说Foo#1保持了与列表Bar#1Bar#2Bar#3,连接表包括:

foo_id | bar_id | order_index
     1 |      1 |           1
     1 |      2 |           2
     1 |      3 |           3

删除时,说出列表中的第一项,Hibernate首先delete进入连接表的最后一行(WTF?):

foo_id | bar_id | order_index
     1 |      1 |           1
     1 |      2 |           2

然后尝试连接表中updatebar_id列而不是order_index(WTF !?),以反映列表中项目的“新”顺序。首先(示意):

foo_id | bar_id | order_index
     1 |      2 |           1
     1 |      2 |           2

下一步将导致:

foo_id | bar_id | order_index
     1 |      2 |           1
     1 |      3 |           2

显然,由于的限制,这种方法听起来不正确, 也不起作用
。更笼统地说,为什么Hibernate搞砸了而不是更新该列呢?unique``bar_id``bar_id``order_index

我认为这是一个Hibernate错误(报告为
HHH-5694
,现在参见HHH-1268)。



 类似资料:
  • 我对冬眠学习还不熟悉,所以研究冬眠学习中使用的关系。我所了解的是-对于带有外键的一域单向关系映射,连接列将位于目标实体中(在我的示例中为Review类)。我不需要让它双向运行。 但是在实现它的同时,我得到了以下错误: OneToMany-单向-示例3 请帮帮忙!!!

  • 我们必须在可选元素“mappedby”中指定什么。是特定模型的table_name还是classname? 哪个是正确的? 这个

  • 问题内容: 我一直在搞怪它并使用它搜索了大约4天,我对Hibernate注释如何与JPA注释一起工作感到疯狂。我有两个非常简单的实体: 学生 电话 我将整个代码粘贴到这里,以便您可以看到导入的来源。我认为问题就在那里。 重要提示 :我使用的是Hibernate Docs建议的 好!现在,我创建了一个包含两个电话号码的,并将其正确保存在数据库中。这将创建以下内容: 学生 学生电话 电话 问题来了。如

  • 问题内容: 所以我有两个简单的豆子- FatKid和Hamburgers。现在,出于我不知道的原因,我不仅需要查找某人吃过的所有汉堡包,而且还要查找谁吃了哪个特定的汉堡包。进入代码! FatKid.java 汉堡包 hibernate.cfg.xml 依存关系 客户 因此,当我运行代码时,我最终得到输出(以及截断的堆栈跟踪) 因此,第一个汉堡被保存,但第二个被炸掉。两者都应该能够使用FatKid的

  • 我有一个实体,依靠它hibernate可以为一个Tomany-Relations生成连接表。 但当我运行应用程序时,我收到以下异常: psqlexception:eroor:列“inner_request_types_id”中的null值违反约束NOT null 否则我如何删除NotNull-Constraint?

  • 我有两个具有一个任意关系的表 类ServiceProvider{ ... @OneTomany(Fetch=FetchType.Eager,MappedBy=“ServiceProvider”,Cascade={CascadeType.All,CascadeType.Remove},OlphanRemove=true)@OnDelete(action=OnDeleteAction.Cascade)