我正在开发一个java web项目,该项目使用:
-
弹簧
4.3.2
-
休眠
5.2.2
/JPA2.0
+MySQL5InnoDBDialect
-
MySQL
5.6.15
-innoDB
(在EasyHP/PHPMyAdmin上(+JDBCconnector 6.0.4
当我想删除一些数据时,遇到了一个错误。但是,只有当我想删除有子项的父行,并且他的一个子项也至少有一个子时,这个问题才存在。
目标:我希望操作/查询删除所选行及其子行和子行。
错误代码:服务器输出中的
2016年9月28日11:51:30.345错误[http-nio-80-exec-42]org.hibernate.internal.ExceptionMapperStandardImpl.mapManagedFlushFailure HHH000346:托管刷新期间出错[org.hibernate exception.ConstraintViolationException:无法执行语句]org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];constraint[null];嵌套异常为org.hubinate.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
孙子班:Reservation
//...
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:无法删除或更新父行:外键约束失败(
commandes
,constraintFK_TAB_COMM
FOREIGN KEY(TAB_ID
(REFERENCEStables
(TAB_ID
(SQL语句:从pavillons
中删除,其中PAV_ID
='2'
这就是为什么我认为问题在数据库方面。
等待你的帮助,任何建议都会有所帮助。
根据@Shadow i的评论,我认为是另一个与孙相关的表/实体导致了这个问题。
任何一个人在未来面临这个问题,都应该重新检查每个相关表的所有关系
例如:Table
A--->Table
B-->Table
C---->Table
D
要删除Table
a的一行(我想要的方式-级联方式(,它需要与Table
D具有正确级联的ON DELETE CASCADE
的所有关系。特别是如果所有CCD_ 26都被强制CCD_。
预期行为-不会生成孤立行。因此,这并不完全是数据库的问题,而是InnoDB
引擎的一个特性。
试着熟悉InnoDB
的外键约束。