Hibernate 从 onetomany 中删除

Posted

技术标签:

【中文标题】Hibernate 从 onetomany 中删除【英文标题】:Hibernate delete from onetomany 【发布时间】:2016-04-22 05:59:02 【问题描述】:

我有两个具有 OneToMany 关系的表

类服务提供者

...

@OneToMany(fetch=FetchType.EAGER,mappedBy="serviceProvider", 级联=CascadeType.ALL,CascadeType.REMOVE,orphanRemoval = true) @OnDelete(action=OnDeleteAction.CASCADE) 私有 列出服务中心; ...

类 ServiceCenterDetails

... //双向多对一关联到 ServiceProviderDomainMap @ManyToOne @JoinColumn(name="SERVICE_PROVIDER_ID") 私有服务提供者 服务提供者;

...

我正在尝试删除提供行。但我得到以下错误:

引起:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(fixoline.service_center_details,CONSTRAINT FK_qvahoxeovx9vmwl6mcu2c0lyw FOREIGN KEY(SERVICE_PROVIDER_ID ) 参考service_provider (ID))

下面是我正在尝试的方式

  String hql = "DELETE FROM ServiceProvider WHERE id =  :providerId";
  Query query = sessionFactory.getCurrentSession().createQuery(hql);
          query.setParameter("providerId",providerId);

  int result = query.executeUpdate();

有人可以帮忙解决吗?

【问题讨论】:

【参考方案1】:

错误信息很清楚:有对您尝试删除的ServiceProviders 的外键引用。先删除ServiceCenterDetails

delete from ServiceCenterDetails where serviceProvider.id = :providerId

【讨论】:

遗憾的是我在 ServiceCenterDetails 表中没有任何行。还有什么可能出错的地方 例外情况另有说明。您是否可以将它们插入到您删除 ServiceProviders 的同一事务中?【参考方案2】:

有两种情况,

    为什么在@oneToMany 中使用CascadeType.ALL 时使用@OnDeleteCascadeType.ALL 将在删除父实体时删除子实体。

    @OnDelete 主要用于带有@ManyToOne 的子实体,否则。

尝试任何选项并检查。

【讨论】:

【参考方案3】:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

此异常告诉您应该先删除与 ServiceProviders 关联的 ServiceCenterDetails,然后再删除 ServiceProviders。

【讨论】:

以上是关于Hibernate 从 onetomany 中删除的主要内容,如果未能解决你的问题,请参考以下文章

在 JPA/Hibernate 中使用 @OnetoMany 的实体中不存在时从数据库中删除子记录(Spring 引导应用程序)

Hibernate/H2 @OneToMany 删除子时“违反参照完整性约束”?

删除元素时使用 JoinTable 和 OrderColumn 的 Hibernate 单向 OneToMany 映射中的约束冲突

JPA 2 / Hibernate 孤儿删除仍然无法与@OneToMany 一起使用?

Hibernate如何正确删除@OneToMany中的孩子?

使用 SpringBoot 和 Hibernate 与复合 pk 的双向 @OneToMany 关系