我正在使用 Spring Data 通过以下实体访问我的 MySQL 数据库
@Entity
@Table(name = "tbl_product")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn
private Category category;
}
@Entity
@Table(name = "tbl_category")
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String name;
}
现在我尝试使用我的Controller
删除Product
@RequestMapping(path="/remove/{id}", method=RequestMethod.DELETE)
@ResponseBody
public String removeProduct(@PathVariable Long id) {
return productService.removeProduct(id);
}
public String removeProduct(Long productID) {
try {
productRepository.delete(productID);
return "OK";
} catch (Exception e) {
logger.info(e.getMessage());
return "Error";
}
}
现在,例如,如果有 3 个 Products
的 Category
A 和 1 个 Category
B,我可以使用 删除一个>类别
B。但是如果我尝试删除任何其他类别,我会得到
Cannot delete or update a parent row: a foreign key constraint fails (
product_db
.tbl_product
, CONSTRAINTFKfq7110lh85cseoy13cgni7pet
FOREIGN KEY (category_id
) REFERENCEStbl_category
(id
))
最佳答案
这是因为您通过cascade = CascadeType.ALL
应用级联。
因此,每当您删除任何产品时,JPA 也会删除类别 ID。如果该类别不与任何其他产品关联(这就是第二种情况下发生的情况),那么它会很好地工作。但是,如果该类别与任何其他产品关联,则外键约束将失败,表明您尝试删除的类别与其他产品关联。
提到级联类型时应该非常小心。默认情况下级联模式为 NONE,但您可以根据您的要求给出不同的策略,如 UPDATE、PERSIST 等
关于mysql - 使用 Spring Data 时外键约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51863114/