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

时间:2019-01-10 20:15:49

标签: hibernate jpa spring-data-jpa one-to-many cascading-deletes

这是我的第一个实体。

@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表中,我们将有n个人(n行)。虽然在每个人的membership表中,我们可以有3-4列(取决于他们的membershipType,因为每个人可以具有多个成员身份,例如主要成员,组成员,个人成员,次要成员,请原谅业务逻辑)。因此,实际上membership表可以有多于n行。

现在我在这里有几个问题

  1. 这是OneToMany表中的ManyToOne还是person -> membership吗?我猜它来自OneToMany的{​​{1}}。

  2. 如何在我的jpa批注和实体类中实现此映射?我需要此来执行删除操作,即,如果我删除person -> membership table,则不应删除相应的membership row。但是,如果删除person row,则对应的person row的{​​{1}}应该被删除。我该如何实现这种映射和功能?

1 个答案:

答案 0 :(得分:1)

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

@ManyToOne
private Person person;

这将大致理解为“许多会员资格可以属于一个人” 。如果您删除一个或多个Membership,则不会删除Person;只是将不再具有删除的成员资格。

要删除一个Memberships中的所有Person-删除Person时,请将成员资格列表添加到Person

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

实际上,没有这些操作,您将无法删除任何Person,然后再删除其所有Membership;后者对Person具有外键约束。

这将大致理解为“一个人可以有很多成员身份” 。如果删除Person,其所有Memberships也将被删除。

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

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