Hibernate中的onetomany删除

8

我有两个表格,它们之间存在OneToMany的关系。

class ServiceProvider {

...

@OneToMany(fetch=FetchType.EAGER,mappedBy="serviceProvider", cascade={CascadeType.ALL,CascadeType.REMOVE},orphanRemoval = true) @OnDelete(action=OnDeleteAction.CASCADE) private List serviceCenters; ...

}

class ServiceCenterDetails {

... //双向多对一与ServiceProviderDomainMap相关联 @ManyToOne @JoinColumn(name="SERVICE_PROVIDER_ID") private ServiceProvider serviceProvider;

...

}

我正在尝试删除提供者行。但是我遇到了以下错误:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (fixoline.service_center_details, CONSTRAINT FK_qvahoxeovx9vmwl6mcu2c0lyw FOREIGN KEY (SERVICE_PROVIDER_ID) REFERENCES 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();

请问有人能帮忙解决这个问题吗?

3个回答

2

这里有两个问题:

  1. 当你使用 @oneToMany 时,为什么还需要使用 @OnDelete,而不是直接使用 CascadeType.ALLCascadeType.ALL 将会在父实体被删除时同时删除子实体。

  2. @OnDelete 主要用于具有 @ManyToOne 的子实体,而不是其他情况。

可以尝试不同的选项并进行检查。


0
错误信息非常清晰:有外键引用了您要删除的ServiceProvider。请先删除ServiceCenterDetails
delete from ServiceCenterDetails where serviceProvider.id = :providerId

很遗憾,ServiceCenterDetails表中没有任何行。还有其他可能出错的地方吗? - Gnani
异常信息显示不同。您是否在删除“ServiceProvider”时将它们插入到同一事务中? - Dragan Bozanovic

0
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

此异常表示您应先删除与服务提供商相关联的服务中心详细信息,然后再删除服务提供商。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接