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包含几个类型:
- CascadeType.PERSIST:级联类型presist意味着save((或PERSIST((操作级联到相关实体
- 级联类型。MERGE:级联类型合并意味着在合并所属实体时合并相关实体
- CascadeType.REFRESH:级联类型刷新对REFRESH((操作执行相同的操作
- CascadeType.REMOVE:删除所属实体时,CascadeType REMOVE将删除与此设置关联的所有相关实体
- 级联类型.DETACH:如果发生"手动分离",级联类型分离将分离所有相关实体
- 级联类型ALL:级联类型ALL是上述所有级联操作的简写
默认值为Type.ALL
对于您的情况,您必须根据要求更改cascadeType
。