Spring jpa 无法删除实体,因为表包含 fk


@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;
}

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

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

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

指定为一对一或一对一对多的关联支持使用孤立删除选项。当孤立删除生效时,以下行为适用:

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

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

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

相关内容