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 行。

现在我有几个问题

  1. 这是 person -> membership table 的 OneToMany 还是 ManyToOne?我从 person -> membership table 猜测它的 OneToMany

  2. 如何在我的 jpa 注释和实体 类 中实现此映射?我需要这个来进行删除操作,即,如果我删除 membership row,则不应删除相应的 person row。但是,如果我删除 person rowALL 相应的 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 用于映射。