删除父

时间:2016-09-28 12:50:11

标签: mysql sql hibernate jpa java-ee

我正在使用以下的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

    < / LI>

我想要删除一些数据时遇到错误。但是,只有当我想删除 有孩子的父行并且孩子 中的一个<时,才会存在此问题/ 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,CONSTRAINT FK_TAB_COMM   FOREIGN KEY(TAB_ID)REFERENCES tablesTAB_ID))SQL语句:   从pavillons WHERE PAV_ID =&#39; 2&#39;

删除

这就是为什么我认为 问题在数据库方面

等待你的帮助,任何建议都会有所帮助。

2 个答案:

答案 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