Spring crud repository-save()尝试在子属性中为多对一关系插入新行



Spring crud repository save((方法在ID为null时执行Insert操作,否则执行Update操作。我有以下实体bean-

Student {
@Id integer studentId;
....
@OneToMany Set<Project> projects;
@OneToMany Set<Subject> subjects;
}
Project {
@Id integer projectId;
....
@ManyToOne Student student;
}
Subject {
@Id integer subjectId;
....
@ManyToOne Student student;
}

如果我使用spring-crud存储库对项目p的一个实例执行save((操作,它会尝试对p.student已经关联的所有Subject执行insert。结果,我得到了一个违反主键约束的错误。

Spring jpa应该只插入Project,而不是整个Student树及其主题集。

有办法做到这一点吗?

当您没有为关联的实体声明CasCadeType时,就会发生这个问题,Cascade包含几个类型:

  1. CascadeType.PERSIST:级联类型presist意味着save((或PERSIST((操作级联到相关实体
  2. 级联类型。MERGE:级联类型合并意味着在合并所属实体时合并相关实体
  3. CascadeType.REFRESH:级联类型刷新对REFRESH((操作执行相同的操作
  4. CascadeType.REMOVE:删除所属实体时,CascadeType REMOVE将删除与此设置关联的所有相关实体
  5. 级联类型.DETACH:如果发生"手动分离",级联类型分离将分离所有相关实体
  6. 级联类型ALL:级联类型ALL是上述所有级联操作的简写

默认值为Type.ALL对于您的情况,您必须根据要求更改cascadeType

最新更新