当前位置: 首页 > 知识库问答 >
问题:

无法删除或更新父行:foreign key约束在联接表中失败

况谦
2023-03-14

尝试删除job对象时出现以下错误:

com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:无法删除或更新父行:外键约束失败(www.subcategory,constraintfk_subcategory_category外键(category_id)在删除时引用category(category(id)不执行更新时不执行任何操作)

表格

+============+   +=================+   +================+
| job        |   |  job_category   |   |  category      |
+============+   +=================+   +================+
| ID         |   |  JOB_ID         |   |  ID            |
|            |   |  CAT_ID         |   |                |
+============+   +=================+   +================+

                 +==================+   +=================+
                 | job_subcategory  |   | subcategory     |   
                 +==================+   +=================+
                 |  JOB_ID          |   |  ID             |
                 |  SUBCAT_ID       |   |  CATEGORY_ID    |
                 +==================+   +=================+

作业可以有许多类别。一个类别可以有许多子类别

job.java

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "job_category", joinColumns = {
        @JoinColumn(name = "JOB_ID", referencedColumnName = "ID") }, inverseJoinColumns = {
                @JoinColumn(name = "CAT_ID", referencedColumnName = "ID") })
private Set<Category> categories;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "job_subcategory", joinColumns = {
        @JoinColumn(name = "JOB_ID", referencedColumnName = "ID") }, inverseJoinColumns = {
                @JoinColumn(name = "SUBCAT_ID", referencedColumnName = "ID") })
private Set<SubCategory> subCategories;
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy = "category")
private Set<SubCategory> subCategories;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "CATEGORY_ID")
private Category category;
protected void remove(Job entity) {
    entityManager.remove(entity);
}

删除job对象时,希望它从job表和联接表(job_categoryjob_subcategory)中删除一行,但不删除categorysubcategory表。

感谢任何建议。

更新

public boolean delete(Job job) {
    Set<SubCategory> subCategories = job.getSubCategories();
    if (subCategories != null) {
        for (SubCategory subCategory : subCategories) {
            entityManager.remove(subCategory);
        }
    }
    Set<Category> categories = job.getCategories();
    if (categories != null) {
        for (Category category : categories) {
            entityManager.remove(category);
        }
    }
    entityManager.remove(job);
    return true;
}

无法删除或更新父行:外键约束失败(wwwjob_subcategory,约束fk_job_subcategory外键(subcat_id)在删除时引用subcategory(id,在更新时没有操作)

该错误只在我完成事务(@transactional)时发生,因此看起来就像是在Hibernate执行提交时发生的。

更新

我尝试以下方法:

public boolean delete(Job job) {
    job.setSubCategories(null);
    job.setCategories(null);
    super.remove(job);
    return true;
}

但再次获得以下内容:

public boolean delete(Job job) {
    job.setSubCategories(null); 
    job.setCategories(null);
    job.setPerson(null);        
    super.remove(job);
    return true;
}

共有1个答案

陆正奇
2023-03-14

好吧,试试看

public boolean delete(Job job) {
    Set<SubCategory> subCategories = job.getSubCategories();
    if (subCategories != null) {
        job.getSubCategories().clear();
        for (SubCategory subCategory : subCategories) {
            subCategory.setJob(null);
            entityManager.remove(subCategory);
        }
    }
    Set<Category> categories = job.getCategories();
    if (categories != null) {
        job.getCategories().clear();
        for (Category category : categories) {
            category.setJob(null);
            entityManager.remove(category);
        }
    }
    job.setPerson(null);
    //if necessary:
    //Person.setJob(null);        
    entityManager.remove(job);
    return true;
}

另外,为什么您有super.remove(job),而没有EntityManager.remove(job),就像我刚刚发布的代码那样?

这段代码是否仍有异常?

 类似资料:
  • 问题内容: 进行时: 错误: 这是我的桌子: 问题答案: 照原样,必须先删除Advertisers表中的行,然后才能删除它引用的Jobs表中的行。这个: …实际上与应有的相反。实际上,这意味着您必须在作业表中有一条记录,然后才是广告商。因此,您需要使用: 纠正外键关系后,您的delete语句将起作用。

  • 我还在学习hibernate中的很多东西,以及如何处理hibernate中表与表之间的关系,所以在我的一个项目中,我面临着以下问题: 问题出在哪里? 我想做什么? 我正在尝试删除package实体,但不删除package表中引用的用户 我正在通过packageDAO对package实体调用delete

  • 我将按id删除对象,但出现如下错误: com。mysql。jdbc。例外情况。jdbc4。MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(,constraint外键()引用) 我按id删除的方法是: 我的表的映射看起来像: Selection.java 作业Audit.java 审核组。JAVA AssignmentAudit

  • 我在这里使用了多对一双向关系,一旦我被放入数据库,我就不能删除文件,如果我试图删除,我会遇到异常,无法删除或更新父行:外键约束失败。 这是我的另一个实体类... 嗨这是我的完整栈迹

  • 问题内容: 我正在研究一个基本示例来测试操作,但出现异常。 我有以下实体: Employee.java EmpDetails.java 现在我在数据库中有员工ID为10的记录,在员工详细信息表中有相应的记录。 现在,当我在查询下面运行时: 我在想hibernate将删除员工记录和相应的员工详细信息记录,因为我已设置要删除的层叠类型。但我得到异常为: 引起原因:com.mysql.jdbc.exce

  • 现在,当我运行命令php artisan migrate时出现问题,它成功地迁移了我的所有表,但当我运行rollback命令时,它会抛出错误,错误是出于我的目的 我的专业移民: 即使我使用onDelete(“cascade”),我也不知道问题出在哪里。我们将非常感谢您的帮助!