无法删除或更新父行Hibernate

时间:2017-10-31 10:27:13

标签: spring hibernate

我有一个设计和场景实体。 删除包含一个或多个方案的Design时出现错误。

设计实体看起来像:

@Entity
public class Design {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(columnDefinition = "LONGBLOB")
    private byte[] image;

    @OneToMany(mappedBy = "design", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Scenario> ScenarioSet;

场景实体如下所示:

@Entity
public class Scenario {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "design_ID")
    private Design design;

如您所见,设计可以有多个场景。 设计负责这种关系。

我保存场景的代码:

    Design design = this.designService.getDesignById(designID);
    scenario.setDesign(design);
    this.scenarioService.saveScenario(scenario);

保存它不是问题。我正在以这种方式保存它,因为该方案最初没有ID。

我得到的错误:

Cannot delete or update a parent row: a foreign key constraint fails (`db`.`scenario`, CONSTRAINT `FKqmttw6jic4aplswy08wtkj5r7` FOREIGN KEY (`design_id`) REFERENCES `design` (`id`))   0.016 sec

这让我觉得当我删除Design时它不会级联。

1 个答案:

答案 0 :(得分:0)

orphanRemoval=true添加到Design实体中的方案列表映射中:

@OneToMany(mappedBy = "design", cascade = CascadeType.ALL, orphanRemoval=true, fetch = FetchType.LAZY)
private Set<Scenario> ScenarioSet;
当您从集合中获取项目并保存拥有实体(在这种情况下为CascadeType.ALL)时,

CascadeType.REMOVE(或精确Design)用于级联删除操作。要告知Hibernate在删除拥有实体(Design)时删除集合中的项目,您需要使用orphanRemoval属性:

https://docs.oracle.com/cd/E19798-01/821-1841/giqxy/