Hibernate 删除OneToMany关系中的实体保留另一方实体(JPA)
我知道标题不太清楚,但这是我能想到的最好的标题。让我解释清楚。 我有一个用Java编写的web应用程序,使用Spring作为后端框架,并使用JPA处理MySql数据库。 假设我们有两个实体:Hibernate 删除OneToMany关系中的实体保留另一方实体(JPA),hibernate,jpa,Hibernate,Jpa,我知道标题不太清楚,但这是我能想到的最好的标题。让我解释清楚。 我有一个用Java编写的web应用程序,使用Spring作为后端框架,并使用JPA处理MySql数据库。 假设我们有两个实体: @Entity public class Item{ private Long itemId; @OneToMany(mappedBy="item") private List<Purchase> purchases; ... } @Entity public clas
@Entity
public class Item{
private Long itemId;
@OneToMany(mappedBy="item")
private List<Purchase> purchases;
...
}
@Entity
public class Purchase{
private Long purchaseId;
@ManyToOne
private Item item;
}
与之相关的购买会发生什么情况?
它是否取决于OneToMany注释的级联属性?是。如果您有级联删除,则将删除购买。如果没有,那么您将有一个异常,因为您的数据库中存在外键约束冲突(它将引用您试图删除的实体)。你为什么不自己试试看呢?是的,关键是我想知道推荐的方法是什么。我的意思是,如果我删除这个项目,我总是会有你们所说的那个例外。我该怎么处理呢?我是否应该每次都尝试捕捉它,或者是否有一种替代方法,以便使用空值而不是item对象?那么,您希望这些购买变成什么?它们要么消失,要么留下,但无法引用不再存在的项目。因此,如果需要后者,请在删除项目之前将purchases项目设置为null。如果该列可为null,则当然可以。只有列具有值时,外键约束才适用。如果它为空则不会。@StefanoSambruna另外,最好检查一下外键,确保它在更新级联时未声明为
,
,因为这意味着每次删除items表中的“parent”行时,所有的“children”都会被删除采购表中具有特定item_id作为外键的行也将被删除。是。如果您有级联删除,则将删除购买。如果没有,那么您将有一个异常,因为您的数据库中存在外键约束冲突(它将引用您试图删除的实体)。你为什么不自己试试看呢?是的,关键是我想知道推荐的方法是什么。我的意思是,如果我删除这个项目,我总是会有你们所说的那个例外。我该怎么处理呢?我是否应该每次都尝试捕捉它,或者是否有一种替代方法,以便使用空值而不是item对象?那么,您希望这些购买变成什么?它们要么消失,要么留下,但无法引用不再存在的项目。因此,如果需要后者,请在删除项目之前将purchases项目设置为null。如果该列可为null,则当然可以。只有列具有值时,外键约束才适用。如果它为空则不会。@StefanoSambruna另外,最好检查一下外键,确保它在更新级联时未声明为,
,因为这意味着每次删除items表中的“parent”行时,所有的“children”都会被删除purchase表中具有特定item_id作为外键的行也将被删除。
itemRepository.delete(item);