简体   繁体   English

如何使用Spring Data JPA删除子记录

[英]How to delete child records using Spring Data JPA

I am having alot of issues trying to delete child records using JPA. 我有很多问题试图使用JPA删除子记录。 Consider the mappings below. 考虑下面的映射。 I am trying to delete all the state data in the jobs table. 我试图删除jobs表中的所有state数据。 When it is removed it will cascade all deletes down the chain. 当它被删除时,它将级联所有删除链。 Here is the chain: 这是链:

Job -> State -> TaskState -> Step 工作 - >状态 - >任务状态 - >步骤

When I try to remove state from job table it is set to NULL. 当我尝试从job表中删除state ,它被设置为NULL。 However it is not cascaded down the chain. 然而,它并没有沿着链条级联。 How would I go about achieving this? 我将如何实现这一目标?

Here is how I am deleting the data: 以下是我删除数据的方法:

@Transactional
public void runJob(Long id) throws IOException, JAXBException {

        Job job = jobRepository.findOne(id);

        if(job.getState() != null){
            State stateObj = stateRepository.findOne(job.getState().getId());
            stateObj.setTasks(null);
            stateRepository.delete(stateObj);
        }

        job.setState(null);
        jobRepository.save(job);
}

Jobs: 工作:

@Entity
@Table(name = "jobs")
public class Job implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "description")
    private String description;
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;
    @OneToOne
    private Image image;
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    private State state;
    @OneToMany
    private List<Task> tasks;
    @Column(name = "status")
    @Enumerated(EnumType.STRING)
    private JobStatusEnum status;
    @ManyToMany
    private List<Device> devices;
    @OneToMany
    private List<JobRun> runs;
    @OneToMany
    private List<Container> containers;

    public Job() {
        this.image = new Image();
        this.status = JobStatusEnum.New;
        this.devices = new ArrayList<>();
        this.runs = new ArrayList<>();
        this.containers = new ArrayList<>();
    }

    public Job(String name, String description, Date date, Image image, State state, List<Task> tasks, JobStatusEnum status, List<Device> devices, List<JobRun> runs, List<Container> containers) {
        this.name = name;
        this.description = description;
        this.date = date;
        this.image = image;
        this.state = state;
        this.tasks = tasks;
        this.status = status;
        this.devices = devices;
        this.runs = runs;
        this.containers = containers;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public List<Task> getTasks() {
        return tasks;
    }

    public void setTasks(List<Task> tasks) {
        this.tasks = tasks;
    }

    public JobStatusEnum getStatus() {
        return status;
    }

    public void setStatus(JobStatusEnum status) {
        this.status = status;
    }

    public List<Device> getDevices() {
        return devices;
    }

    public void setDevices(List<Device> devices) {
        this.devices = devices;
    }

    public List<JobRun> getRuns() {
        return runs;
    }

    public void setRuns(List<JobRun> runs) {
        this.runs = runs;
    }

    public List<Container> getContainers() {
        return containers;
    }

    public void setContainers(List<Container> containers) {
        this.containers = containers;
    }
}

State: 州:

@Entity
@Table(name = "state")
public class State implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name="name")
    private String name;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<TaskState> tasks;

    public State() {
        tasks = new ArrayList<>();
    }

    public State(Long id, String name, List<TaskState> tasks) {
        this.id = id;
        this.name = name;
        this.tasks = tasks;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<TaskState> getTasks() {
        return tasks;
    }

    public void setTasks(List<TaskState> tasks) {
        this.tasks = tasks;
    }
}

TaskState: TaskState:

@Entity
@Table(name = "task_state")
public class TaskState implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "parent")
    private Long parent;
    @Column(name = "referenceid")
    private Long referenceId;
    @Column(name = "name")
    private String name;
    @Column(name = "status")
    private TaskStatusEnum status;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Step> steps;
    @Column(name = "maxAttempts")
    private Integer maxAttempts;
    @ManyToOne
    @JsonIgnore
    private State state;

    public TaskState() {
        status = TaskStatusEnum.New;
        steps = new ArrayList<>();
        maxAttempts = 5;
    }

    public TaskState(Long id, Long parent, Long referenceId, String name, TaskStatusEnum status, List<Step> steps, Integer maxAttempts) {
        this();
        this.id = id;
        this.parent = parent;
        this.referenceId = referenceId;
        this.name = name;
        this.status = status;
        this.steps = steps;
        this.maxAttempts = maxAttempts;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getParent() {
        return parent;
    }

    public void setParent(Long parent) {
        this.parent = parent;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public TaskStatusEnum getStatus() {
        return status;
    }

    public void setStatus(TaskStatusEnum status) {
        this.status = status;
    }

    public List<Step> getSteps() {
        return steps;
    }

    public void setSteps(List<Step> steps) {
        this.steps = steps;
    }

    public Long getReferenceId() {
        return referenceId;
    }

    public void setReferenceId(Long referenceId) {
        this.referenceId = referenceId;
    }

    public Integer getMaxAttempts() {
        return maxAttempts;
    }

    public void setMaxAttempts(Integer maxAttempts) {
        this.maxAttempts = maxAttempts;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}

Step: 步:

@Entity
@Table(name = "step")
public class Step implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "groupname")
    private String group;
    @Column(name = "route")
    private String route;
    @Column(name = "celerytask")
    private String celeryTask;
    @Column(name = "postbackqueuename")
    private String postBackQueueName;
    @Column(name = "postbackerrorqueuename")
    private String postBackErrorQueueName;
    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private TaskStatusEnum status;
    @ElementCollection
    private List<String> arguements;
    @Column(name="runningTaskId")
    private Long runningTaskId;
    @Column(name="result")
    private String result;
    @Column(name="attempt")
    private Integer attempt;
    @JsonIgnore
    @ManyToOne
    private TaskState task;

    public Step() {
        arguements = new ArrayList<>();
        status = TaskStatusEnum.New;
        attempt = 0;
    }

    public Step(String name, String group, String route, String celeryTask, String postBackQueueName, String postBackErrorQueueName, TaskStatusEnum status, List<String> arguements, Long runningTaskId) {
        this();
        this.name = name;
        this.group = group;
        this.route = route;
        this.celeryTask = celeryTask;
        this.postBackQueueName = postBackQueueName;
        this.postBackErrorQueueName = postBackErrorQueueName;
        this.status = status;
        this.arguements = arguements;
        this.runningTaskId = runningTaskId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

    public String getRoute() {
        return route;
    }

    public void setRoute(String route) {
        this.route = route;
    }

    public String getCeleryTask() {
        return celeryTask;
    }

    public void setCeleryTask(String celeryTask) {
        this.celeryTask = celeryTask;
    }

    public String getPostBackQueueName() {
        return postBackQueueName;
    }

    public void setPostBackQueueName(String postBackQueueName) {
        this.postBackQueueName = postBackQueueName;
    }

    public String getPostBackErrorQueueName() {
        return postBackErrorQueueName;
    }

    public void setPostBackErrorQueueName(String postBackErrorQueueName) {
        this.postBackErrorQueueName = postBackErrorQueueName;
    }

    public List<String> getArguements() {
        return arguements;
    }

    public void setArguements(List<String> arguements) {
        this.arguements = arguements;
    }

    public TaskStatusEnum getStatus() {
        return status;
    }

    public void setStatus(TaskStatusEnum status) {
        this.status = status;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public Integer getAttempt() {
        return attempt;
    }

    public void setAttempt(Integer attempt) {
        this.attempt = attempt;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getRunningTaskId() {
        return runningTaskId;
    }

    public void setRunningTaskId(Long runningTaskId) {
        this.runningTaskId = runningTaskId;
    }

    public TaskState getTask() {
        return task;
    }

    public void setTask(TaskState task) {
        this.task = task;
    }
}

It's not cascading because of stateObj.setTasks(null); 由于stateObj.setTasks(null);它不是级联的stateObj.setTasks(null); .

You're breaking the link between the State and its Tasks so when you're deleting the State, the delete doesn't cascade on anything. 您正在断开State及其Tasks之间的链接,因此当您删除State时,删除不会对任何内容进行级联。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 spring-jpa 中使用 JPQL 删除 2000 条记录的最佳方法 - Best approach to delete 2000 records using JPQL in spring-jpa Spring Data JPA - 删除子实体而不是在更新时设置为 null? - Spring Data JPA - Delete child entities instead of setting to null on update? Spring 数据 JPA:删除 OneToMany 子节点而不经过父节点 - Spring Data JPA: delete OneToMany child without going through the parent Spring数据JPA:如何在不引用父级中的子级的情况下启用级联删除? - Spring data JPA: how to enable cascading delete without a reference to the child in the parent? 使用 orphanRemoval 自动删除子实体 Spring JPA - Automatically delete child entity using orphanRemoval Spring JPA 如何使用Spring Boot和JPA一起软性删除父级和子级(级联) - How to soft delete parent and child together (cascade) using spring boot with jpa Spring Boot JPA:如何删除多对一关系的子实体 - Spring Boot JPA : How to delete child entity of a Many to One relation 如何使用JPA有条件地删除记录? - How to conditionally delete records with JPA? 如何删除现有记录并在Hibernate / JPA中的映射/子表上插入新记录 - How to delete existing records and insert new records on a mapping/child table in Hibernate/JPA 春天在OneToMany JPA Relationship中使用子数据获取父数据 - Fetching parent data using Child Data in OneToMany JPA Relationship in spring
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM