我需要删除两个对象之间的关系,但在一侧设置为空后,另一侧关系仍然存在。我怎样才能让它在第二面也消失? 我有任务和用户实体:
@Entity
@Table(name = "task")
public class Task {
@ManyToOne
@JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "FK_task_user_id"))
private User user;
}
任务实体:
@Entity
@Table(name = "user")
public class User {
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<Task> tasks;
}
替换用户执行任务的测试:
@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);
}
最初任务分配给id 2的用户。下一个关系应该消失,但当我调用方法 findByTask 时,它仍然返回带有 id 2 的用户。分配具有 id 1 的用户后,findByTask 仍然返回具有 id 2 的用户。当我尝试从用户集合中删除任务时:
Task task = taskService.findById(6);
User user = task.getProcessingUser();
user.getProcessingTasks().remove(task);
userService.save(user);
task.setProcessingUser(null);
taskService.save(task);
我在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]
如何从任务中删除用户,但不从数据库中删除用户或任务?
编辑 在这里我找到了答案:JPA OneToMany with Jointable, deleting a link deletes right-side object - 问题是 orphanRemoval 等于 true。
最佳答案
尝试从用户中删除任务对象。所有引用都必须被丢弃,双向。像这样:
Task task = taskService.findById(6);
User user = task.getUser(); //HERE
user.getTasks().remove(task); //..and HERE
task.setUser(null);
taskService.save(task);
关于java - 如何在 hibernate 中将ManyToOne关系设置为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46928871/