java - 如何在 hibernate 中将ManyToOne关系设置为null

标签 java hibernate jpa many-to-one

我需要删除两个对象之间的关系,但在一侧设置为空后,另一侧关系仍然存在。我怎样才能让它在第二面也消失? 我有任务和用户实体:

@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/

相关文章:

java - ReSTLet 添加自定义解码器

java - 2 IntentServices 访问文件系统上的相同数据..安全吗?

java - 获取不支持 DML 操作异常

java - JPA - @MapKey 和 @EmbeddedId

java - Android http 连接 OkHttp 不工作

java - 我如何否定我创建的 Java Fraction 类

java - 事务未在 Spring + Hibernate + JPA 设置中创建

hibernate - JPA 实体是否可以具有未映射到 DB 列的字段

java - 外部 JAR 中的 JPA 实体

mysql - 带有连接表的 ManyToOne、oneToMany