如何在休眠

时间:2017-10-25 09:33:38

标签: java hibernate jpa many-to-one

我需要删除两个对象之间的关系,但是在一方面设置为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等于是真的。

1 个答案:

答案 0 :(得分:1)

尝试从User中删除Task对象。两种方式都必须丢弃所有引用。像这样:

{{1}}