gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:35:00 29 4
gpt4 key购买 nike

我在尝试使用 JPA 删除子记录时遇到了很多问题。考虑下面的映射。我正在尝试删除 jobs 表中的所有 state 数据。当它被删除时,它会将所有删除级联到链中。这是链:

作业 -> 状态 -> 任务状态 -> 步骤

当我尝试从 job 表中删除 state 时,它被设置为 NULL。然而,它并没有级联到链下。我将如何实现这一目标?

以下是我删除数据的方式:

@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);
}

工作:

@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;
}
}

状态:

@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;
}
}

任务状态:

@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;
}
}

步骤:

@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;
}
}

最佳答案

因为 stateObj.setTasks(null); 而不是级联。

您正在破坏状态与其任务之间的链接,因此当您删除状态时,删除不会级联任何内容。

关于java - 如何使用 Spring Data JPA 删除子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42027049/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com