Hibernate 删除一对多关系中的父项会引发MySQLIntegrityConstraintViolationException

Hibernate 删除一对多关系中的父项会引发MySQLIntegrityConstraintViolationException,hibernate,many-to-many,one-to-many,Hibernate,Many To Many,One To Many,我有一个典型的一对多的情况。一辆车有很多东西 @Entity @Table(name="CART") public class Cart { //... @OneToMany(fetch = FetchType.LAZY, mappedBy="cart") @Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE }) private Set<Items> items; //

我有一个典型的一对多的情况。一辆车有很多东西

@Entity
@Table(name="CART")
public class Cart {

//...

@OneToMany(fetch = FetchType.LAZY, mappedBy="cart")
@Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE })
private Set<Items> items;

// getters and setters
}
我试图实现的行为:

  • 购物车得到更新或保存,商品应该得到更新或保存
  • 购物车被删除,项目应该而不是被删除。(项目有自己的生命周期。)
  • 当购物车被删除时,items表上的外键应设置为null
在当前的实现中,最后一点没有发生。运行代码并删除购物车会导致:

 MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails ...

对于这种情况,推荐的hibernate解决方案是什么?

尝试以下方法:

Transaction transaction = session.beginTransaction();
items.setCart(null);
session.update(items);
session.delete(cart);
transaction1.commit();

在删除购物车之前,应将项目的购物车属性设置为
null

Cart cartToDel = cartRepository.getOne(1l);
cartToDel.getItems().forEach(item -> item.setCart(null));
cartRepository.delete(cartToDel);
Cart cartToDel = cartRepository.getOne(1l);
cartToDel.getItems().forEach(item -> item.setCart(null));
cartRepository.delete(cartToDel);