Spring Data Jpa 删除删除映射上的外键行?

the*_*mer 1 hibernate jpa one-to-many cascading-deletes spring-data-jpa

这是我的第一个实体。

@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
}
Run Code Online (Sandbox Code Playgroud)

这是我的第二个实体

@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
}
Run Code Online (Sandbox Code Playgroud)

本质上,在person表中我们将有n人员(n行)。在membership每个人的表中,我们可以有 3-4 列(取决于他们membershipType,因为每个人可以有多个成员身份,如主要、组、个人、次要等,请原谅业务逻辑)。所以实际上membership表可能有超过n行。

现在我有几个问题

  1. 这是一个表OneToMany还是ManyToOne来自person -> membership表?我猜它OneToMany来自person -> membership table.

  2. 如何在 jpa 注释和实体类中实现此映射?我需要这个来进行删除操作,即,如果我删除一个membership row,则相应的person row不应被删除。但是,如果我删除person rowALL相应的membership rows应该被删除。我该如何实现这种映射和功能?

pir*_*rho 7

添加Person- 而不是 person.id - 到您的Membership

@ManyToOne
private Person person;
Run Code Online (Sandbox Code Playgroud)

这可以粗略地理解为“一个人可以拥有多个成员资格”。如果删除一个或多个Membership则不会删除Person;它只是不会再删除会员资格了。

为了删除所有Memberships成员-删除时 - 将成员资格列表添加到:PersonPersonPerson

@OneToMany(cascade = CascadeType.ALL, mappedBy="person") // maybe CascadeType.REMOVE is enough for you
private List<Membership> memberships = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

实际上,如果没有它,您将无法Person在删除所有Membership内容之前删除任何内容;后者有一个外键约束Person

这可以粗略地理解为“一个人可以拥有多个成员资格”。如果您Person也删除,其所有内容Memberships也将被删除。

Membership需要列表,因为这样 JPA 可以级联删除CascadeType.ALL(或删除)。

属性mappedBy告诉 JPA 检查person要映射到的字段。如果 JPA 无法找到要映射的字段,它将创建一个单独的表用于映射。

  • @程序员不,不是。这个列表纯粹是 Java 方面的。如果有某个列它只能引用一个“Membership”,对吧? (2认同)