2017-10-31 26 views
0

私は設計とシナリオのエンティティを持っています。 1つ以上のシナリオを含むデザインを削除するときにエラーが発生します。あなたはデザインが複数のシナリオを持つことができます見ることができるように親行を削除または更新できませんHibernate

@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; 

:シナリオのエンティティがどのように見える

@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; 

デザイン・エンティティは次のようになります。 デザインはその関係を担当しています。それは問題ではありません保存

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 

これは私がデザインを削除するとき、それがカスケードされていないと思います。

+0

、Design' '削除するコードを追加してください:所有エンティティ(Design)が削除されたときに、コレクション内の項目を削除するために休止状態を言うと、あなたはorphanRemoval属性を使用する必要があります。 –

答えて

0

DesignエンティティであなたのシナリオリストのマッピングにorphanRemoval=trueを追加します。

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

CascadeType.ALL(または正確にCascadeType.REMOVE)あなたは、コレクションからアイテムを取るときの動作を削除し、所有するエンティティを保存カスケードに役立つ(Designでこの場合)。

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

関連する問題