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

Hibernate/MySQL级联错误删除父

祁曦哲
2023-03-14

我正在从事一个java web项目,该项目使用:

>

  • Spring4.3.2

    Hibernate5.2.2/JPA2.0MySQL5InnoDBDialect

    MySQL5.6.15-nonDB(在EasyPHP/PHPMyAdmin上)JDBC连接器6.0.4

    当我想删除一些数据时,我遇到了一个错误。但是,只有当我想删除一个有子级的父行并且他的一个子行也至少有一个子行时,这个问题才存在。

    目标:我希望操作/查询删除所选行及其子行和子行。

    错误代码:在服务器输出中

    28-Sep-2016 11:51:30.345ERROR[超文本传输协议-nio-80-exec-42]org.hibernate.internal.ExceptionMapperStandardmpl.mapManagedFlushFailure HHH000346:托管刷新期间出错[org.hibernate.exception.ConstraintViolationException:无法执行语句]org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[null];嵌套异常org.hibernate.exception.ConstraintViolationException:无法执行语句

    父类:Pavillon

    //...
    private Set<Table> pavTables;
    //...
    @JsonIgnore
    @Cascade(CascadeType.ALL)
    @OneToMany(orphanRemoval = true, mappedBy = "pavillon", fetch = FetchType.EAGER)
    public Set<com.optimal.waiter.component.model.Table> getPavTables() {
        return pavTables;
    }
    //...setters & others
    

    子类:Table

    //...
    private Pavillon pavillon;
    //...
    @NotNull
    @Basic(optional = false)
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "PAV_ID")
    public Pavillon getPavillon() {
        return pavillon;
    }
    @JsonIgnore
    @Cascade(CascadeType.ALL)
    @OneToMany(orphanRemoval = true, mappedBy = "table", fetch = FetchType.EAGER)
    public Set<Reservation> getTableReservations() {
        return tableReservations;
    }
    //...setters & others
    

    孙班:预订

    //...
    private Table table;
    //...
    @NotNull
    @Basic(optional = false)
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "TAB_ID", nullable = false)
    public Table getTable() {
        return table;
    }
    //...setters & others
    

    SQL:

    CREATE TABLE PAVILLONS
    (
       PAV_ID               INT(10) NOT NULL AUTO_INCREMENT,
       PAV_NOM              VARCHAR(25) NOT NULL,
       PAV_DES              TEXT,
       PAV_TYPE             INT(1) NOT NULL DEFAULT 0,
       PRIMARY KEY (PAV_ID)
    );
    CREATE TABLE TABLES
    (
       TAB_ID               INT(10) NOT NULL AUTO_INCREMENT,
       PAV_ID               INT(10) NOT NULL DEFAULT 1,
       TAB_DISPO            TINYINT(1) NOT NULL DEFAULT 1,
       TAB_TYPE             INT(1) NOT NULL DEFAULT 0,
       PRIMARY KEY (TAB_ID)
    );
    CREATE TABLE RESERVATIONS
    (
       RES_ID               INT(10) NOT NULL AUTO_INCREMENT,
       TAB_ID               INT(10) NOT NULL,
       PRIMARY KEY (RES_ID)
    );
    ALTER TABLE TABLES ADD CONSTRAINT FK_PAV_TAB FOREIGN KEY (PAV_ID)
          REFERENCES PAVILLONS (PAV_ID) ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE RESERVATIONS ADD CONSTRAINT FK_TABLE_RESERVATION FOREIGN KEY (TAB_ID)
      REFERENCES TABLES (TAB_ID) ON DELETE CASCADE ON UPDATE CASCADE;
    

    PS:错误仍然即使当我尝试删除然后使用SQL查询直接在PHPMyAdmin.

    错误代码:在服务器输出中

    错误1451:1451:无法删除或更新父行:外键约束失败(命令, CONSTRAINTFK_TAB_COMMFOREIGN KEY(TAB_ID)REFERENCESTAB_ID))SQL语句:DELETE fromPavillonsWHEREPAV_ID='2'

    这就是为什么我认为问题出在DB端。

    等待你的帮助,任何建议都会有所帮助。


  • 共有2个答案

    荀正谊
    2023-03-14

    这是预期的行为-不生成孤立行。因此,这并不完全是数据库的问题,而是InnoDB引擎的一个特性。

    尝试熟悉InnoDB的外键约束。

    冯澄邈
    2023-03-14

    根据@Shadow i的评论,我认为另一个与孙子相关的表/实体会导致这个问题。

    今后任何一个人面对这个问题,都应该重新检查每个相关表的所有关系。

    例如:表---

    要删除一行表a(我想要的方式-级联方式),它需要在删除级联时与表D具有正确级联的所有关系。特别是当所有的FK被强制非空时。

     类似资料:
    • 我有一个非常简单的Spring靴测试 我要从父实体中删除子实体。链接使用的是单向,拥有实体是父实体。我试着给1打电话。,但hibernate最终生成了一个update语句,将parent_name设置为null(而不是delete where parent_name=“father”),这违反了子表中的不可为null约束。 然后我试着打电话给2。,这一次它给出了一个异常。 你如何修复上面的,以使儿

    • 问题内容: 我对级联=“删除”的工作方式感到困惑。我在“城市”映射文件中以以下方式定义了映射: 类客户具有类城市的外键。 因此,当我运行时: 是否还应该删除所有客户端,还是必须以某种方式处理它?我是否将查询作为方法参数正确传递给会话的delete()方法?谢谢你的帮助。最好的问候,混蛋。 问题答案: 我对cascade =“ delete”的工作方式有些困惑(…) 级联操作意味着,如果您是父母,则

    • 我试图通过联接表的一个外键级联删除联接表中的行,它有另一个与之相关的表,我也想删除与此ID相关的所有行。看起来像下图。当我使用会话时。使用hibernate删除(reqCandObject)它工作正常,并通过从候选jobReq表中删除一个条目以及相关注释进行级联。但是,我想删除所有具有特定候选ID的候选项(并删除注释)。我尝试了下面的函数,但与nice hibernate不同。删除(对象)函数,此

    • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它会在-预期行为中创建新的行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hib

    • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

    • 我使用的是Hibernate的JPA实现。我有一个包含不同类型用户(私有、公共等)的用户表,user_type列指定用户的类型。 我有一个User类,它是一个表示User表的实体。我补充说 在我的用户类上创建了两个类,PrivateUser和PublicUser,它们都用相应的@DiscriminatorValue扩展了用户类。 如果我的解释不清楚,请让我知道。 提前致谢