jpa - 无法删除或更新外键约束失败的父行
问题描述
无法删除或更新父行:外键约束失败(
gopick
.orders_paid_items
, CONSTRAINTFKeeefhbl6j5xhs7nnt5mn530f8
FOREIGN KEY (paid_items_product_id
,paid_items_user_id
) REFERENCEScart
(product_id
,user_id
))
下面的购物车实体
@Entity
@ToString
@EqualsAndHashCode
@IdClass(CartIdPk.class)
public class Cart implements Serializable {
@Column(unique = true)
private Long id = Long.parseLong(String.format("%06d", new Random().nextInt(999999)));
@JsonIgnore
@Id
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
private User user;
private CartStatus cartStatus = CartStatus.IN_CART;
@Id
private int productId;
private int quantity = 0;
@Column(length = 10, nullable = true)
private String discount;
@Column(length = 30, nullable = true)
private String paymentRef;
@JsonIgnore
@Column(insertable = false, updatable = true)
@UpdateTimestamp
private Timestamp lastModified;
@CreationTimestamp
private Timestamp dateCreated;
}
Id 类对象 CartIdPk
@NoArgsConstructor
@AllArgsConstructor
@lombok.Data
public class CartIdPk implements Serializable {
private Long user;
private int productId;
}
下单实体
@lombok.Data
@Entity
public class Orders implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
private User user;
@OneToMany(fetch = FetchType.LAZY)
private Collection<Cart> paidItems;
@JsonIgnore
@Column(insertable = false, updatable = true)
@UpdateTimestamp
private Timestamp lastModified;
@CreationTimestamp
private Timestamp dateCreated;
}
当我尝试从购物车实体表中删除时,如果productId
生成的实体表中不存在它,它会完美运行,orders_paid_items
但如果存在,它会引发如上所述的错误。
使用默认CrudRepository
删除方法从购物车表中删除项目,如下所示
cartDataService.remove(cartDataService.find(cartId));
解决方案
在 java 中使用 JPA 和 ORM 时的经验法则是记住您同时拥有一个对象模型和一个关系数据库模型,并且您必须在两者中进行更改。
所以你在订单和购物车之间有一对多。
因此,为了争论,您尝试删除当前处于订单中的购物车。当保存发生时,您将违反完整性,因为您尝试删除的购物车仍被订单引用。
您需要做的是在删除之前从卡中删除订单,因为您在订单中引用了购物车。
始终尝试在“对象”级别和数据库级别进行更改。
推荐阅读
- wordpress - 在我 wordpress 内部的所有操作中出现 admin-ajax.php 错误
- postgresql - 如何在 postgresql 中以日期格式转换 unixtime stamp?
- react-native - React-Native WebView 打开 Google Docs 删除标题
- laravel - 如何在不显示html标签的情况下显示数据
- javascript - 在外部/全局访问 axios 响应数据的方式
- python - 创建多个实例共享公信
- android - 为什么在添加新地方sdk时出错AdvertisingIdClient错误
- python - 代码大战。整数:娱乐一。我有错误“执行超时”
- javascript - 如何使用 JavaScript 以表单形式显示图像
- javascript - 如何将点击事件保存在本地存储中