Beacze
Beacze

Reputation: 534

How to setup relationship ManyToOne to null in hibernate

I need to remove relationship between two objects, but after setup to null on one side, on the second side relationship persists. How can I make this gone also on second side? I have Task and User entity:

@Entity
@Table(name = "task")
public class Task {
    @ManyToOne
    @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "FK_task_user_id"))
    private User user;
}

Task entity:

@Entity
@Table(name = "user")
public class User {

    @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
    private List<Task> tasks;
}

Tests for replace user for task:

@Test
public void shouldReplaceUser() throws Exception {
    UserService userService = new UserService();
    TaskService taskService = new TaskService();

    int size = userService.findByTask(6).size();
    System.out.println(userService.findByProcessingTask(6).get(0).getId());
    assertEquals("Incorrect amount of processing users!", 1, size);

    Task task = taskService.findById(6);
    task.setUser(null);
    taskService.save(task);
    Task task = taskService.findById(6);
    System.out.println(userService.findByTask(6).get(0).getId());
    size = userService.findByTask(6).size();
    assertNull("User is not null!", task.getUser());
    //assertEquals("Incorrect amount of users!", 0, size);

    task = taskService.getById(6);
    task.setUser(userService.findById(1));
    taskService.save(task);
    taskDTO = taskService.findById(6);
    System.out.println(userService.findByTask(6).get(0).getId());
    size = userService.findByTask(6).size();
    assertEquals("Incorrect id of user!", Integer.valueOf(1), taskDTO.getUser().getId());
    assertEquals("Incorrect amount of users!", 1, size);
}

Initally task is assigned to user with id 2. Next relation should be gone but still when I call method findByTask it returns me user with id 2. After assigning user with id 1, still findByTask returns user with id 2. When I try to remove task from user collection:

Task task = taskService.findById(6);
User user = task.getProcessingUser();
user.getProcessingTasks().remove(task);
userService.save(user);
task.setProcessingUser(null);
taskService.save(task);

I get error on line userService.save(user):

javax.persistence.EntityNotFoundException: deleted object would be re-saved by cascade (remove deleted object from associations): [org.kitodo.data.database.beans.Task#6]

How I can remove user from task but not remove user nor task from database?

Edit Here I have found answer: JPA OneToMany with Jointable, deleting a link deletes right-side object - the problem was orphanRemoval equal true.

Upvotes: 0

Views: 212

Answers (1)

Jack Flamp
Jack Flamp

Reputation: 1233

Try removing the Task object from User. All references must be discarded, both ways. Like this:

Task task = taskService.findById(6);
User user = task.getUser(); //HERE
user.getTasks().remove(task); //..and HERE
task.setUser(null);
taskService.save(task);

Upvotes: 1

Related Questions