我正在使用一个java web项目的Hibernate/MySQL的级联错误:上删除父
春
4.3.2
休眠
5.2.2
/JPA2.0
+MySQL5InnoDBDialect
MySQL
5.6.15
-innoDB
(上的EasyPHP /的phpMyAdmin)+ JDBCconnector 6.0.4
我面对一个错误,当我想删除一些数据。但是,这个问题并不只存在,如果我想删除父一行有孩子和他的一个孩子也有至少一个孩子。
目标:我想要的动作/查询删除所选行和其子女和孙辈。
错误代码:在服务器输出
9月28日-2016 11:51:30.345 ERROR [HTTP-NIO-80-EXEC-42] org.hibernate.internal.ExceptionMapperStandardImpl .mapManagedFlushFailure HHH000346:托管刷新期间出错[org.hibernate.exception.ConstraintViolationException:无法执行语句] org.springframework.dao.DataIntegrityViolationException:无法执行语句; SQL [n/a];约束[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
儿童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:错误仍然即使当我尝试删除,然后直接使用SQL查询中PHPMyAdmin
。
错误代码:在服务器输出
错误1451:1451:不能删除或更新父行,外键 约束失败(
commandes
,约束FK_TAB_COMM
外键(TAB_ID
)参考文献tables
(TAB_ID
))SQL Statement: DELETE FROMpavillons
WHEREPAV_ID
='2'
这就是为什么我认为问题是在数据库端。
等待你的帮助,任何建议都会有所帮助。
请更新您的问题,显示'show create table myTable'的输出,其中myTable至少是儿童的输入 – Drew
我相信你在混合使用Hibernate和JPA注解。我不确定这是否有效。你可以尝试删除Hibernate的'Cascade'注释并使用'@ OneToMany'作为'@OneToMany(...,cascade = CascadeType.ALL)' - 并且注意'CascadeType'是javax.persistence.CascadeType! –
错误消息中的外键名称与您使用的外键名称不同。是否有可能定义了多个FK并且其中一个没有删除级联部分? – Shadow