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】:错误信息很清楚:有对您尝试删除的ServiceProvider
s 的外键引用。先删除ServiceCenterDetails
:
delete from ServiceCenterDetails where serviceProvider.id = :providerId
【讨论】:
遗憾的是我在 ServiceCenterDetails 表中没有任何行。还有什么可能出错的地方 例外情况另有说明。您是否可以将它们插入到您删除ServiceProvider
s 的同一事务中?【参考方案2】:
有两种情况,
为什么在@oneToMany
中使用CascadeType.ALL
时使用@OnDelete
? CascadeType.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 一起使用?