Spring Crud存储库-save()尝试为子属性中的多对一关系插入新行

时间:2018-12-04 20:12:35

标签: spring hibernate jpa spring-data-jpa spring-data

如果ID为null,Spring Crud Repository save()方法将执行插入操作,否则将执行更新操作。我有以下实体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存储库在Project p的一个实例上执行save()操作,它将尝试在p.student已经关联的所有Subject上执行插入。结果,我收到一个主键约束冲突错误。

Spring jpa应该只插入项目,而不是整个学生树及其主题集。

有什么办法吗?

1 个答案:

答案 0 :(得分:2)

当您不为关联的实体声明CasCadeType时,就会发生此问题,而Cascade包含多个Type:

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

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