#java #mysql #spring-data-jpa #one-to-many #spring-boot-jpa
Вопрос:
У меня есть сценарий, в котором у меня есть связь между двумя таблицами. Одно-это шаг, а другое-знать, кто будет следующим шагом.
выберите * из cpo_workflow_step_control;
Сущность шага:
@Entity
@Table(name = "cpo_workflow_step")
public class CpoWorkflowStep implements java.io.Serializable {
@Id
@Column(name = "workflow_step_id")
@OneToMany(fetch = FetchType.EAGER, mappedBy = "cpoWorkflowStepByWorkflowNextStepId",
cascade = CascadeType.ALL, orphanRemoval = true)
private Set<CpoWorkflowStepControl> cpoWorkflowStepControlsForWorkflowNextStepId
= new HashSet<CpoWorkflowStepControl>(0);
@OneToMany(fetch = FetchType.EAGER, mappedBy = "cpoWorkflowStepByWorkflowStepId",
cascade = CascadeType.ALL, orphanRemoval = true)
private Set<CpoWorkflowStepControl> cpoWorkflowStepControlsForWorkflowStepId
= new HashSet<CpoWorkflowStepControl>(0);
Step_Control
@Entity
@Table(name = "cpo_workflow_step_control")
public class CpoWorkflowStepControl implements java.io.Serializable {
@Id
@Column(name = "workflow_step_control_id")
private String workflowStepControlId;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "workflow_next_step_id", nullable = false)
private CpoWorkflowStep cpoWorkflowStepByWorkflowNextStepId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "workflow_step_id", nullable = false)
private CpoWorkflowStep cpoWorkflowStepByWorkflowStepId;
Моя проблема в том, что, когда я пытаюсь сохранить шаг, связанный с Step_Control, JPA пытается сохранить все, и жалуется, что у последнего объекта отсутствуют некоторые свойства. Потому что последний шаг в свойстве cpoWorkflowStepControlsForWorkflowStepId еще не был сохранен.
16:05:07.587 [http-nio-8004-exec-1] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1048, SQLState: 23000
16:05:07.587 [http-nio-8004-exec-1] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Column 'workflow_id' cannot be null
Итак, есть способ сообщить JPA, каков порядок сохранения всех шагов, прежде чем сохранять Step_Control? Нужно ли мне сохранять все шаги, прежде чем сохранять разделенный Step_Control?
Я использую метод сохранения из JpaRepository для сохранения объекта рабочего процесса со всеми шагами и его отношениями внутри. 1 — Рабочий процесс -> *Шаг ->> *Step_Control
workflowRepository.save(workflowFound);
Ответ №1:
Я думаю, что в этом случае лучше сначала сохранить все шаги, прежде чем управлять любым шагом.
Я бы, по крайней мере, удалил cascade = CascadeType.ALL
это из @OneToMany
аннотации. После этого я бы сначала сохранил шаги, а с сохраненными шагами-управление шагами.
Проблема отображения, которое у вас есть, заключается в том, что step пытается сохранить управление шагом, но также управление шагом пытается сохранить шаг, сохранения должны быть только в одном направлении, чтобы избежать этих проблем.
Также я хотел упомянуть, что вы должны использовать fetch = FetchType.EAGER property
очень осторожно, так как это может привести к проблеме утечки памяти.
Комментарии:
1. Спасибо. Я убрал каскад и поставил fetch как Ленивый. Теперь я сохраняю все шаги, удаляю все элементы управления шагами и снова сохраняю все элементы управления шагами. Меня беспокоит, когда пользователь обновляет элемент управления шагами. Я не знаю, удаляю ли я все элементы управления шагами, даже если пользователь делает обновление и воссоздает их снова.