同一实体列上的java双向关联不能为null
我有一个场景,两个表之间有一个关系。一个是第一步,另一个是知道谁是下一步
从cpo_工作流_步骤_控件中选择*
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 楼答案
我认为在这种情况下最好先保存所有步骤,然后再进行任何步骤控制
我至少要从
@OneToMany
注释中删除cascade = CascadeType.ALL
。在此之后,我将首先保存步骤和步骤,以及步骤控件映射的问题是step试图保存step控件,但step控件也试图保存step,保存应仅在一个方向上,以避免这些问题
我还想提到的是,您应该非常小心地使用fetch=
FetchType.EAGER property
,因为它可能会导致内存泄漏问题