Spring Data Jpa 在删除映射时删除外键行?
Spring Data Jpa delete foreign key rows on delete mapping?
这是我的第一个实体。
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String firstName;
private String lastName;
// Removed other stuff for brevity
}
这是我的第二个实体
@Entity
@Table(name = "membership")
public class Membership {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String membershipType;
// Help here, I need another column called person_id which is what will correspond
// to persons or person rows from person table
}
基本上 person
table 我们将有 n
人(n
行)。在 membership
table 中,每个人可以有 3-4 列(取决于他们的 membershipType
,因为每个人可以有多个成员资格,如主要成员、团体成员、个人成员、次要成员等,请原谅商业逻辑)。所以实际上 membership
table 可能有超过 n
行。
现在我有几个问题
这是 person -> membership
table 的 OneToMany
还是 ManyToOne
?我从 person -> membership table
猜测它的 OneToMany
。
如何在我的 jpa 注释和实体 类 中实现此映射?我需要这个来进行删除操作,即,如果我删除 membership row
,则不应删除相应的 person row
。但是,如果我删除 person row
,ALL
相应的 membership rows
应该被删除。我如何去实现这个映射和功能?
添加 Person
- 而不是 person.id - 到您的 Membership
:
@ManyToOne
private Person person;
大致可以理解为'Many Membership can belong to One Person'。如果您删除一个或多个 Membership
它不会删除 Person
;它不会再删除会员资格了。
为了删除一个 Person
的所有 Memberships
- 当 Person
被删除时 - 添加成员列表到 Person
:
@OneToMany(cascade = CascadeType.ALL, mappedBy="person") // maybe CascadeType.REMOVE is enough for you
private List<Membership> memberships = new ArrayList<>();
实际上,如果没有它,您将无法在删除所有 Membership
之前删除任何 Person
;后者具有 Person
.
的外键约束
大致可以理解为'One Person can have many Membership'。如果您删除 Person
,其所有 Memberships
也将被删除。
List 是必需的,因为这样 JPA 可以将删除级联到 Membership
因为有 CascadeType.ALL
(或删除)。
属性 mappedBy
告诉 JPA 检查要映射到的字段 person
。如果 JPA 无法以其他方式找到要映射的字段,它将创建一个单独的 table 用于映射。
这是我的第一个实体。
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String firstName;
private String lastName;
// Removed other stuff for brevity
}
这是我的第二个实体
@Entity
@Table(name = "membership")
public class Membership {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String membershipType;
// Help here, I need another column called person_id which is what will correspond
// to persons or person rows from person table
}
基本上 person
table 我们将有 n
人(n
行)。在 membership
table 中,每个人可以有 3-4 列(取决于他们的 membershipType
,因为每个人可以有多个成员资格,如主要成员、团体成员、个人成员、次要成员等,请原谅商业逻辑)。所以实际上 membership
table 可能有超过 n
行。
现在我有几个问题
这是
person -> membership
table 的OneToMany
还是ManyToOne
?我从person -> membership table
猜测它的OneToMany
。如何在我的 jpa 注释和实体 类 中实现此映射?我需要这个来进行删除操作,即,如果我删除
membership row
,则不应删除相应的person row
。但是,如果我删除person row
,ALL
相应的membership rows
应该被删除。我如何去实现这个映射和功能?
添加 Person
- 而不是 person.id - 到您的 Membership
:
@ManyToOne
private Person person;
大致可以理解为'Many Membership can belong to One Person'。如果您删除一个或多个 Membership
它不会删除 Person
;它不会再删除会员资格了。
为了删除一个 Person
的所有 Memberships
- 当 Person
被删除时 - 添加成员列表到 Person
:
@OneToMany(cascade = CascadeType.ALL, mappedBy="person") // maybe CascadeType.REMOVE is enough for you
private List<Membership> memberships = new ArrayList<>();
实际上,如果没有它,您将无法在删除所有 Membership
之前删除任何 Person
;后者具有 Person
.
大致可以理解为'One Person can have many Membership'。如果您删除 Person
,其所有 Memberships
也将被删除。
List 是必需的,因为这样 JPA 可以将删除级联到 Membership
因为有 CascadeType.ALL
(或删除)。
属性 mappedBy
告诉 JPA 检查要映射到的字段 person
。如果 JPA 无法以其他方式找到要映射的字段,它将创建一个单独的 table 用于映射。