【问题标题】:Hibernate delete from onetomanyHibernate 从 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();

有人可以帮忙解决吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

    delete from ServiceCenterDetails where serviceProvider.id = :providerId
    

    【讨论】:

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

    有两种情况,

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

    2. @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。

      【讨论】:

        猜你喜欢
        • 2014-11-16
        • 1970-01-01
        • 2017-01-02
        • 2014-10-17
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 2013-01-19
        • 2020-06-25
        相关资源
        最近更新 更多