Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring JPA - deleting child element doesn't reflect in database table

I'm having problems deleting the child element of a one-to-many relationship entity. Here's a code snippet:

@Override
@Transactional
public void deleteTask(UUID listId, UUID taskId) {
    TaskList list = repo.findOne(listId);

    System.out.println("Old List: " + list);

    for(Task t : list.getTasks()) {
        if(t.getId().toString().equals(taskId.toString())) {
            System.out.println(list.getTasks().remove(t));
            System.out.println("Task with id " + taskId + " deleted.");
        }
    }
    System.out.println("New List: " + repo.save(list));
}

The Task class is this:

@Entity(name = "task")
public class Task implements Serializable {    

    // Id and 3 fields

    @ManyToOne
    @JoinColumn(name="tasklist_id")
    private TaskList parentList;

    // 3 more fields

    // Constructor
    public Task() {}

    //Getters and Setters
}

and the TaskList class is this:

@Entity(name = "task_list")
public class TaskList implements Serializable {

    // Id and two fields

    @OneToMany(mappedBy="parentList", cascade={CascadeType.ALL})
    private List<Task> tasks;

    // Constructor
    public TaskList() {}
}

The Task entity is the child, and even though the save() function returns the truncated TaskList, I can't get the changes to show in a separate query to the database. The number of tasks remains the same. However, deleting a list through repo.delete(listId) works fine with both the list and its tasks gone.

Here, repo is a repository corresponding to the parent TaskList class. All operations to the child Task class happen through a @OneToMany({cascade=CascadeType.ALL}) relation.

For some reason, searching for all TaskLists using repo.findAll() also returns faulty results.

I'm obviously doing something fundamentally wrong. Please tell me what to do.

like image 508
cst1992 Avatar asked Feb 08 '16 08:02

cst1992


Video Answer


1 Answers

You need to add orphanRemoval = true to your mapping:

@OneToMany(mappedBy="parentList", cascade={CascadeType.ALL}, orphanRemoval=true)

list.getTasks().remove(t) just removes entity from the collection, so you need to tell JPA to remove it also from DB. This is done by the orphanRemoval attribute.

like image 174
Jakub Kubrynski Avatar answered Oct 18 '22 22:10

Jakub Kubrynski