我正在使用以下的java web项目:
春天4.3.2
Hibernate 5.2.2
/ JPA 2.0
+ MySQL5InnoDBDialect
MySQL 5.6.15
- innoDB
(在EasyPHP / PHPMyAdmin上)+ JDBC connector 6.0.4
我想要删除一些数据时遇到错误。但是,只有当我想删除 有孩子的父行并且孩子 中的一个<时,才会存在此问题/ strong>至少一个孩子。
目标:我希望操作/查询删除所选行及其子孙。
服务器输出中的错误代码
2016年9月28日11:51:30.345错误[http-nio-80-exec-42] org.hibernate.internal.ExceptionMapperStandardImpl.mapManagedFlushFailure HHH000346:托管刷新期间出错[org.hibernate.exception.ConstraintViolationException:could不执行声明] org.springframework.dao.DataIntegrityViolationException:无法执行语句; SQL [不适用];约束[null];嵌套异常是org.hibernate.exception.ConstraintViolationException:无法执行语句
家长classe: 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
Child classe: 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
WHEREPAV_ID
=&#39; 2&#39;
这就是为什么我认为 问题在数据库方面。
等待你的帮助,任何建议都会有所帮助。
答案 0 :(得分:0)
预期行为 - 不生成孤立行。所以这不是数据库的问题,而是InnoDB
引擎的一个特性。
尝试熟悉InnoDB
s Foreign Key Constraints。
答案 1 :(得分:0)
根据@Shadow的评论,我认为与孙子相关的另一个表/实体导致了这个问题。
以后任何人都会遇到此问题,应该重新检查每个相关表格的所有关系。
例如:Table
A ---&gt; Table
B ---&gt; Table
C ---&gt; Table
的 d 强>
要删除一行Table
A (我想做的方式 - Cascade方式),它需要与Table
保持一直关系D 正确级联ON DELETE CASCADE
。特别是如果所有FK
都被强制NOT NULL
。