删除父项时出现Hibernate/MySQL级联错误
我正在从事一个java web项目,该项目使用:删除父项时出现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
- 弹簧
4.3.2
- Hibernate
/JPA5.2.2
+2.0
mysql5innodbdial
- MySQL
-5.6.15
(在EasyPHP/PHPMyAdmin上)+JDBCinnoDB
连接器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的注释,我发现与孙子相关的另一个表/实体会导致此问题 任何人都会遇到此问题今后,应该重新检查每个相关表的所有关系。 例如:
表格
表格表格
要删除一行
表
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;