删除父项时出现Hibernate/MySQL级联错误

删除父项时出现Hibernate/MySQL级联错误,mysql,sql,hibernate,jpa,jakarta-ee,Mysql,Sql,Hibernate,Jpa,Jakarta Ee,我正在从事一个java web项目,该项目使用: 弹簧4.3.2 Hibernate5.2.2/JPA2.0+mysql5innodbdial MySQL5.6.15-innoDB(在EasyPHP/PHPMyAdmin上)+JDBC连接器6.0.4 当我想删除一些数据时,我遇到了一个错误。但是,只有当我想删除有子项的父行,并且他的一个子项也至少有一个子项时,这个问题才存在 目标:我希望操作/查询删除所选行及其子行和子行 服务器输出中的错误代码: 2016年9月28日11:51:30.3

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

  • 弹簧
    4.3.2

  • Hibernate
    5.2.2
    /JPA
    2.0
    +
    mysql5innodbdial

  • MySQL
    5.6.15
    -
    innoDB
    (在EasyPHP/PHPMyAdmin上)+JDBC
    连接器6.0.4

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


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


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

2016年9月28日11:51:30.345错误[http-nio-80-exec-42]org.hibernate.internal.exceptionapperstandardimpl.mapManagedFlushFailure hh000346:托管刷新期间出错[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
孙子班:
预约

//...
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:即使我在
PHPMyAdmin
中尝试删除然后直接使用SQL查询,错误仍然存在

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

错误1451:1451:无法删除或更新父行:外键 约束失败(
命令
,约束FK_选项卡_命令 外键(
TAB\u ID
)引用
tables
TAB\u ID
)SQL语句: 从
pavillons
中删除
PAV\u ID
='2'

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


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

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


尝试熟悉InnoDBs。

根据@Shadow i的注释,我发现与孙子相关的另一个表/实体会导致此问题

任何人都会遇到此问题今后,应该重新检查每个相关表的所有关系。

例如:
表格
表格
表格
表格D


要删除一行
a(我想要的方式-级联方式),它需要与
D在删除级联时正确级联
。特别是如果所有的
FK
都被强制
notnull

对不起,我不明白你的观点。您认为my DB中的数据在删除过程之前是否包含一些孤立行?@MalekBoubakri否,但如果您的查询成功,则会有孤立行。这就是它失败的原因。我的错,!!我确实编辑了我的问题,请再次检查。我忘了提到我的目标。请更新您的问题,显示
show create table myTable
的输出,其中myTable至少是适合孩子的。我相信您混合了Hibernate和JPA注释。我不确定这是否有效。您能否尝试删除Hibernate的
Cascade
注释,并使用
@OneToMany
作为
@OneToMany(…,Cascade=CascadeType.ALL)
-请注意
CascadeType
这里是
javax.persistence.CascadeType
!错误消息中的外键名称与您使用的外键名称不同。您是否定义了多个FK,其中一个没有on delete cascade部分?@NikosParaskevopoulos我尝试了两种方法,没有区别。此外,如果我使用
javax.persistence.CascadeType
DAO
中设置了更多不需要的内容。没有必要这样做,在这种情况下这不是问题所在。谢谢你的帮助。@Shadow可能是!!,我有另一个名为
Commande
的类,它使用
@OneToOne
关系随class表附上。这在概念上意味着一个表可以有许多保留,一个命令是一个表的setter,表ID是必需的。我想这就是问题所在,谢谢。
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;