【问题标题】:Spring crud repository - save() tries to insert new rows for many-to-one relationship in child propertySpring crud 存储库 - save() 尝试在子属性中为多对一关系插入新行
【发布时间】:2019-05-06 08:07:24
【问题描述】:

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 已关联的所有主题执行插入。结果,我得到一个主键约束冲突错误。

Spring jpa 应该只插入项目,而不是整个 Student 树和它的主题集。

有什么办法吗?

【问题讨论】:

  • 你能分享一下你是如何创建和插入项目的代码吗?
  • 还请澄清integer 是什么。它是自定义类型吗?错字?还是 Java 以外的其他东西?
  • 它是 java.lang.Integer,抱歉打错了。

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


【解决方案1】:

当您没有为关联实体声明 CasCadeType 时会发生此问题,级联包含多个类型:

  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

【讨论】:

  • 但是在互联网上到处都说默认不会级联任何操作
猜你喜欢
  • 2018-01-13
  • 2019-03-10
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多