Hibernate Spring数据Jpa删除映射上的外键行?
这是我的第一个实体Hibernate Spring数据Jpa删除映射上的外键行?,hibernate,jpa,spring-data-jpa,one-to-many,cascading-deletes,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 brevi
@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
行)。在成员资格
表中,每个人可以有3-4列(取决于他们的成员资格类型
,因为每个人可以有多个成员资格,如主要、组、个人、次要等,请原谅业务逻辑)。所以在现实中,membership
表可能有超过n
行
现在我有几个问题
person->membership
表的OneToMany
还是manytone
?我从person->membership表猜到了它的OneToMany
成员行
,则相应的人员行
不应被删除。但是,如果我删除个人行
,所有相应的成员行
都应该被删除。如何实现这种映射和功能
将
个人
-而不是Person.id-添加到您的会员资格
:
@ManyToOne
private Person person;
这大致可以理解为“许多会员可以属于一个人”。如果删除一个或多个成员
,则不会删除人员
;它不会再删除会员资格了
要删除一名人员的所有成员资格
,请在删除人员
时,将成员资格列表添加到人员
:
@OneToMany(cascade = CascadeType.ALL, mappedBy="person") // maybe CascadeType.REMOVE is enough for you
private List<Membership> memberships = new ArrayList<>();
@OneToMany(cascade=CascadeType.ALL,mappedBy=“person”)//也许CascadeType.REMOVE对你来说就足够了
私有列表成员身份=新的ArrayList();
实际上,如果没有这一点,您将无法在删除其所有成员之前删除任何人员
;后者对Person
具有外键约束
这大致可以理解为“一个人可以拥有多个成员”。如果您删除个人
,其所有会员资格也将被删除
列表是必需的,因为这样JPA可以将删除级联到成员身份
,因为存在级联类型.ALL
(或remove)
属性mappedBy
告诉JPA检查要映射到的字段person
。如果JPA无法找到要映射的字段,它将创建一个单独的映射表。将Person
-而不是Person.id-添加到您的会员资格中
:
@ManyToOne
private Person person;
这大致可以理解为“许多会员可以属于一个人”。如果删除一个或多个成员
,则不会删除人员
;它不会再删除会员资格了
要删除一名人员的所有成员资格
,请在删除人员
时,将成员资格列表添加到人员
:
@OneToMany(cascade = CascadeType.ALL, mappedBy="person") // maybe CascadeType.REMOVE is enough for you
private List<Membership> memberships = new ArrayList<>();
@OneToMany(cascade=CascadeType.ALL,mappedBy=“person”)//也许CascadeType.REMOVE对你来说就足够了
私有列表成员身份=新的ArrayList();
实际上,如果没有这一点,您将无法在删除其所有成员之前删除任何人员
;后者对Person
具有外键约束
这大致可以理解为“一个人可以拥有多个成员”。如果您删除个人
,其所有会员资格也将被删除
列表是必需的,因为这样JPA可以将删除级联到成员身份
,因为存在级联类型.ALL
(或remove)
属性mappedBy
告诉JPA检查要映射到的字段person
。如果JPA无法找到要映射的字段,它将创建一个单独的映射表。1.在成员资格表中,这会创建一个名为人员的列吗?2.我们应该做newarraylist()代码>当我们声明列表成员身份时正确
?@theprogrammer 1。将参照表person
列id
创建名为person\u id
的列。2.这是一种方式。但它也可以在第一个成员身份添加到个人之前初始化EntityManager
在需要时自动初始化它,但是如果它是null
,您当然不能添加任何成员身份。哦,好的,谢谢。最后一个疑问。在您提供的@OneToMany
代码中,它还会在Person
表中创建一个新列吗?如果是这样的话,该列的名称是什么?@程序员:不,它没有。这个列表纯粹是Java方面的。如果有某个列,它只能引用一个成员资格
,对吗?1.在成员资格
表中,这会创建一个名为人员
的列吗?2.我们应该做newarraylist()代码>当我们声明列表成员身份时正确
?@theprogrammer 1。将参照表person
列id
创建名为person\u id
的列。2.这是一种方式。但它也可以在第一个成员身份添加到个人之前初始化EntityManager
在需要时自动初始化它,但是如果它是null
,您当然不能添加任何成员身份。哦,好的,谢谢。最后一个疑问。在您提供的@OneToMany
代码中,它还会在Person
表中创建一个新列吗?如果是这样的话,该列的名称是什么?@程序员:不,它没有。这个列表纯粹是Java方面的。如果有某个栏目,它只能引用一个会员资格
,对吗?