Ionut Robert
Ionut Robert

Reputation: 254

Java Spring Repository delete not working OneToMany Relationship

I have an issue with a delete to a Many side of a ManyToOne relationship. I've already removed all CascadeTypes from the relationship but the issue still remains. The entry won't be removed (only selects are executed and no delete query). I'm trying to delete it through a CRUD repository call to delete. It calls the method and executes successfully but nothing happens.

The relationship goes as follows: an Activity has an assigned Course, a course can have many activities assigned to it. An Activity has a specific ActivityType.

The classes are as below.

Activity

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;

    ...
}

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;

...
}

Activity Type (has no reference to Activity)

public class ActivityType implements Item, Serializable {

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

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

Any ideas how can I solve this issue or at least debug it? Thank you.

Upvotes: 1

Views: 7243

Answers (2)

Add orphanRemoval = true attribute in the @OneToMany annotation in your Course entity.

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;

    ...

}

Upvotes: 6

Mikita Herasiutsin
Mikita Herasiutsin

Reputation: 118

Try to delete reference to Activity from Course. It seems unnecessary to me

Upvotes: 1

Related Questions