有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

同一实体列上的java双向关联不能为null

我有一个场景,两个表之间有一个关系。一个是第一步,另一个是知道谁是下一步

enter image description here

从cpo_工作流_步骤_控件中选择*

enter image description here

Step实体:

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

步进控制

@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_控件关联,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在保存步骤控制之前先保存所有步骤的顺序是什么?在保存步骤之前是否需要保存所有步骤

我使用JpaRepository中的save方法来保存包含所有步骤及其关系的工作流对象。1-工作流程->*步骤->*步进控制

workflowRepository.save(workflowFound);

共 (1) 个答案

  1. # 1 楼答案

    我认为在这种情况下最好先保存所有步骤,然后再进行任何步骤控制

    我至少要从@OneToMany注释中删除cascade = CascadeType.ALL。在此之后,我将首先保存步骤和步骤,以及步骤控件

    映射的问题是step试图保存step控件,但step控件也试图保存step,保存应仅在一个方向上,以避免这些问题

    我还想提到的是,您应该非常小心地使用fetch=FetchType.EAGER property,因为它可能会导致内存泄漏问题