单向关系:删除级联

时间:2017-08-08 11:09:26

标签: java mysql hibernate jpa

我有两张桌子:

CREATE TABLE IF NOT EXISTS `DB`.`global_history` (
  `ID` INT(11) AUTO_INCREMENT,
  `ID_HISTORY` INT(11) NULL,

  PRIMARY KEY (`ID`),

  CONSTRAINT `FK_HISTORY_GLOBAL_HISTORY`
    FOREIGN KEY (`ID_HISTORY`)
    REFERENCES `DB`.`history` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

第二张表:

CREATE TABLE IF NOT EXISTS `DB`.`history` (
  `ID` INT(11) AUTO_INCREMENT,
  `TIMESTAMP` DATETIME NOT NULL,
  PRIMARY KEY (`ID`));

但是当我尝试删除历史记录(第二个表)中的一行时,我收到此错误:

  

- >无法删除或更新父行:外键约束失败

我希望关系为@ManyToOne因此,当我从global_history删除一行时,它不会删除history中的任何行

这是我的模特课:

全球历史:

@ManyToOne
@JoinColumn(name = "ID_HISTORY", nullable = true)
private History history;

- >历史是一个简单的类

2 个答案:

答案 0 :(得分:0)

看看Hibernate property annotations。您必须设置级联类型。 @Cascade(CascadeType.DELETE)应该有效

答案 1 :(得分:0)

当您从子(global_history)到父(历史表)定义F.K时,子表不能具有无效的F.K.所以你应该决定删除导致F.K无效的父母。 具有级联删除的外键意味着如果删除父表中的记录,则将自动删除子表中的相应记录。这在SQL Server中称为级联删除。

因此,如果要阻止删除相应的子行,可以使用以下命令设置空值或默认值:

 ON DELETE SET NULL
 ON DELETE SET DEFAULT

这是完整的格式:

CREATE TABLE child_table
(
  column1 datatype [ NULL | NOT NULL ],
  column2 datatype [ NULL | NOT NULL ],
  ...

  CONSTRAINT fk_name
    FOREIGN KEY (child_col1, child_col2, ... child_col_n)
    REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
    ON DELETE CASCADE
    [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
)

https://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php