2016-09-28 68 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

我的错!我确实编辑了我的问题,请再次检查。我忘了提到我的目标。 –