我需要删除两个对象之间的关系,但是在一方面设置为null之后,第二方关系仍然存在。我怎么能在第二方面消失呢? 我有任务和用户实体:
@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(用户):
上遇到错误javax.persistence.EntityNotFoundException:已删除的对象将通过级联重新保存(从关联中删除已删除的对象):[org.kitodo.data.database.beans.Task#6]
如何从任务中删除用户但不从数据库中删除用户或任务?
修改 在这里我找到了答案:JPA OneToMany with Jointable, deleting a link deletes right-side object - 问题是orphanRemoval等于是真的。
答案 0 :(得分:1)
尝试从User中删除Task对象。两种方式都必须丢弃所有引用。像这样:
{{1}}