Reputation: 534
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
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