Две двунаправленные ассоциации в одном и том же столбце сущности не могут быть пустыми

#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 как Ленивый. Теперь я сохраняю все шаги, удаляю все элементы управления шагами и снова сохраняю все элементы управления шагами. Меня беспокоит, когда пользователь обновляет элемент управления шагами. Я не знаю, удаляю ли я все элементы управления шагами, даже если пользователь делает обновление и воссоздает их снова.