Spring JPA - 删除子元素不会反射(reflect)在数据库表中

标签 spring hibernate jpa

我在删除一对多关系实体的子元素时遇到问题。
这是一个代码片段:

@Override
@Transactional
public void deleteTask(UUID listId, UUID taskId) {
    TaskList list = repo.findOne(listId);

    System.out.println("Old List: " + list);

    for(Task t : list.getTasks()) {
        if(t.getId().toString().equals(taskId.toString())) {
            System.out.println(list.getTasks().remove(t));
            System.out.println("Task with id " + taskId + " deleted.");
        }
    }
    System.out.println("New List: " + repo.save(list));
}

任务类是这样的:
@Entity(name = "task")
public class Task implements Serializable {    

    // Id and 3 fields

    @ManyToOne
    @JoinColumn(name="tasklist_id")
    private TaskList parentList;

    // 3 more fields

    // Constructor
    public Task() {}

    //Getters and Setters
}

TaskList 类是这样的:
@Entity(name = "task_list")
public class TaskList implements Serializable {

    // Id and two fields

    @OneToMany(mappedBy="parentList", cascade={CascadeType.ALL})
    private List<Task> tasks;

    // Constructor
    public TaskList() {}
}
Task实体是 child ,即使 save() 函数返回截断的 TaskList ,我无法将更改显示在对数据库的单独查询中。任务数量保持不变。但是,通过 repo.delete(listId) 删除列表列表及其任务都消失了,效果很好。

在这里,repo是对应于父 TaskList 的存储库类(class)。对 child 的所有操作Task类(class)通过 @OneToMany({cascade=CascadeType.ALL}) 发生关系。

出于某种原因,搜索所有 TaskList s 使用 repo.findAll()也会返回错误的结果。

我显然在做一些根本错误的事情。请告诉我该怎么办。

最佳答案

您需要添加 orphanRemoval = true到您的映射:
@OneToMany(mappedBy="parentList", cascade={CascadeType.ALL}, orphanRemoval=true)list.getTasks().remove(t)只是从集合中删除实体,所以你需要告诉 JPA 也从数据库中删除它。这是由 orphanRemoval 完成的属性。

关于Spring JPA - 删除子元素不会反射(reflect)在数据库表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35264809/

相关文章:

java - 无法获取 Jedis 连接,无法从池中获取资源

java - Spring Data JPA - 结果中具有多个聚合函数的自定义查询

java - Hibernate 的映射问题

exception - javax.persistence.PersistenceException : Unable to build entity manager factory

java - JPA 2 @SequenceGenerator @GeneratedValue 产生唯一约束冲突

java - Hibernate,当我删除 @OneToMany 关系中的实体时进行 n+1 次查询

java - 如何使用特定注释将自定义序列化器设置为任意 API 端点(spring 应用程序)?

java - 无法构建 Hibernate SessionFactory 没有明显原因

java - 如何在请求体中仅发送 id 而不是对象?

java - 以可联合的顺序 hibernate ManyToMany