2016-09-28 66 views
1

我正在使用一個java web項目的Hibernate/MySQL的級聯錯誤:上刪除父

  • 4.3.2

  • 休眠5.2.2/JPA 2.0 + MySQL5InnoDBDialect

  • MySQL5.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)參考文獻tablesTAB_ID))SQL Statement: DELETE FROM pavillons WHERE PAV_ID ='2'

這就是爲什麼我認爲問題是在數據庫端

等待你的幫助,任何建議都會有所幫助。

+0

請更新您的問題,顯示'show create table myTable'的輸出,其中myTable至少是兒童的輸入 – Drew

+1

我相信你在混合使用Hibernate和JPA註解。我不確定這是否有效。你可以嘗試刪除Hibernate的'Cascade'註釋並使用'@ OneToMany'作爲'@OneToMany(...,cascade = CascadeType.ALL)' - 並且注意'CascadeType'是javax.persistence.CascadeType! –

+1

錯誤消息中的外鍵名稱與您使用的外鍵名稱不同。是否有可能定義了多個FK並且其中一個沒有刪除級聯部分? – Shadow

回答

1

根據@Shadow i的評論,我想到另一個與孫子有關的表/實體會導致這個問題。

任何一個面臨這個問題在未來,應該重新檢查每個相關表的所有關係。

例如:Table --->Table --->TableÇ --->Tabled

要刪除的Table一個行(我想做的方式 - 級聯方式),它需要一路關係TableD正確級聯ON DELETE CASCADE。特別是如果全部FK被迫NOT NULL

0

它預計的行爲 - 不會產生孤行。所以它不完全是數據庫的問題,而是一個InnoDB引擎的功能。

請嘗試熟悉InnoDB s Foreign Key Constraints

+0

對不起,我不明白你的觀點。你認爲我的數據庫中的數據在刪除過程之前是否包含一些孤立行? –

+1

@MalekBoubakri不,但會有,如果您的查詢會成功。這就是爲什麼它失敗。 – Antoniossss

+0

我的錯!我確實編輯了我的問題,請再次檢查。我忘了提到我的目標。 –