【问题标题】:How to setup relationship ManyToOne to null in hibernate如何在休眠中将关系ManyToOne设置为null
【发布时间】:2017-10-25 09:33:38
【问题描述】:

我需要删除两个对象之间的关系,但是在一侧设置为 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(user) 上遇到错误:

javax.persistence.EntityNotFoundException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):[org.kitodo.data.database.beans.Task#6]

如何从任务中删除用户,但不能从数据库中删除用户或任务?

编辑 在这里我找到了答案:JPA OneToMany with Jointable, deleting a link deletes right-side object - 问题是 orphanRemoval 等于 true。

【问题讨论】:

    标签: java hibernate jpa many-to-one


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是仍然是相同的异常,但在 taskService.save(task) 上。我不知道为什么甚至删除了对象,因为我没有从数据库中删除任何对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多