【问题标题】:Spring jpa can't delete entity because a table has fk to itSpring jpa 无法删除实体,因为表中有 fk
【发布时间】:2020-06-14 10:04:40
【问题描述】:
@Entity
@Getter
@Setter
@Table(name = "children")
public class Child extends BaseEntity {

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @OneToOne
    @JoinColumn(name = "group_id", referencedColumnName = "id")
    private Group group;

    @Column(name = "medical_info")
    private String medicalInfo;

    @Column(name = "birth_date")
    @Temporal(TemporalType.DATE)
    private Date birthDate;

    @Column(name = "starting_date")
    @Temporal(TemporalType.DATE)
    private Date startingDate;

    @Column(name = "native_language")
    private String nativeLanguage;

    @Column(name = "second_language")
    private String secondLanguage;

    private String picture;
}

我尝试删除一个组,但失败了,因为某些 Child 对该组有 fk。该组对 Child 没有任何 fk。我可以通过将所有具有 fk 的子项查找到该组并将该组设置为 null 然后保存来做到这一点,但这看起来很老套,并且肯定有更好的选择。我怎样才能以一种好的方式删除该 fk?

【问题讨论】:

  • 你能分享你的SQL吗?

标签: java sql spring spring-data-jpa


【解决方案1】:

如果你想在父级设置空值,你可以在你的字段中使用 CASCADE 注释。您可以在规范中找到更多详细信息:https://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html

另一种情况,如果您想删除相关实体,您也可以尝试在相关字段上添加注释的 orphanRemoval 属性。引用 JPA 2.0 规范中的相关部分:

指定为 OneToOne 或 OneToMany 的关联支持使用 orphanRemoval 选项。 orphanRemoval 生效时,以下行为适用:

如果从关系中删除作为关系目标的实体(通过将关系设置为 null 或从关系集合中删除实体),则删除操作将应用于被孤立的实体。删除操作在刷新操作时应用。 orphanRemoval 功能适用于由其父实体私有“拥有”的实体。便携式应用程序不得依赖于特定的删除顺序,并且不得将已孤立的实体重新分配给另一个关系或以其他方式尝试持久化它。如果被孤立的实体是分离的、新的或已删除的实体,则 orphanRemoval 的语义不适用。

如果删除操作应用于托管源实体,则删除操作将按照第 3.2.3 节的规则级联到关系目标,(因此不需要指定 cascade=REMOVE关系

孤儿移除规范:https://docs.oracle.com/cd/E19798-01/821-1841/giqxy/

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 2019-08-14
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多