这是我的第一个实体。
@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
行。
现在我在这里有几个问题
这是OneToMany
表中的ManyToOne
还是person -> membership
吗?我猜它来自OneToMany
的{{1}}。
如何在我的jpa批注和实体类中实现此映射?我需要此来执行删除操作,即,如果我删除person -> membership table
,则不应删除相应的membership row
。但是,如果删除person row
,则对应的person row
的{{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否则无法找到要映射的字段,它将创建一个单独的表进行映射。