2017-05-08 5 views
0

ManyToOne関係のMany側に削除に関する問題があります。私は既にすべてカスケードタイプを関係から削除しましたが、それでも問題は残ります。エントリは削除されません(選択項目のみが実行され、削除クエリは実行されません)。削除するCRUDリポジトリ呼び出しで削除しようとしています。メソッドを呼び出して正常に実行されますが、何も起こりません。Java Springリポジトリの削除が機能しないOneToMany関係

関係は次のようになります。アクティビティには割り当てられたコースがあり、コースには多くのアクティビティが割り当てられます。アクティビティには特定のアクティビティタイプがあります。

クラスは次のとおりです。

活性

public class Activity implements Item, Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    ... 

    @ManyToOne 
    @JoinColumn(name = "type_id", nullable = false) 
    private ActivityType type; 

    @ManyToOne 
    @JoinColumn(name = "course_id", nullable = false) 
    @JsonSerialize(using = CustomCourseSerializer.class) 
    private Course course; 

    ... 
} 

コース

public class Course implements Item, Serializable { 

... 

@OneToMany(mappedBy = "course", fetch = FetchType.EAGER, targetEntity = Activity.class) //cascade = { CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.REMOVE} 
@Fetch(value = FetchMode.SUBSELECT) 
private List<Activity> activities; 

... 
} 

活動タイプ(活動への参照を持たない)

public class ActivityType implements Item, Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@Column(name = "name", nullable = false, unique = true) 
private String name; 
... 
} 

どのように私はこの問題を解決するか、少なくともそれをデバッグできますか?ありがとうございました。

+1

あなたは 'orphanRemoval = true'を試しましたか? –

+0

orphanRemovalをコース終了時に追加しましたが、何も変更されていません。さらに、これは望ましくない動作です(アクティビティを削除するときにコースを削除する)。それとも、アクティビティパートに追加することを指していますか? –

+1

子 'Activity'を削除する場合は、' Course'クラスに '@OneToMany(orphanRemoval = true)'を追加する必要があります。そして、 'Activity'が削除された場合、これはあなたの' Course'を削除しません。 –

答えて

2

Courseエンティティの@OneToMany注釈のorphanRemoval = true属性を追加してください。

public class Course implements Item, Serializable { 

    ... 

    @OneToMany(mappedBy = "course", fetch = FetchType.EAGER, targetEntity = Activity.class, orphanRemoval = true, cascade = CascadeType.REMOVE) 
    @Fetch(value = FetchMode.SUBSELECT) 
    private List<Activity> activities; 

    ... 

} 
+0

これを正しく動作させるために、この 'cascade = {CascadeType.MERGE、CascadeType.REFRESH、CascadeType.DETACH、CascadeType.REMOVE} 'も追加しました。 –

+0

なぜ 'cascade = CascadeType.ALL'を追加しないのですか? –

+0

何らかの理由で、ALLに含まれているCascadeType.PERSISTが、削除が実行されないようにします。たぶんそれはORMのデータコンテキストのものです、私は確信していません。 –

1

Activityへの参照をCourseから削除してみてください。私には不要です。

+0

'Course'から' Activity'への参照を削除しましたが、それでも動作しません。 –

関連する問題