我正在使用一個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