我有一个设计和场景实体。 删除包含一个或多个方案的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时它不会级联。
答案 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
属性: