使用spring数据时外键约束失败

k2fxgqgv  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(292)

我使用spring数据访问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、 我可以把那个 `Category` b。但如果我想把其他的移走
无法删除或更新父行:外键约束失败( `product_db` . `tbl_product` ,约束 `FKfq7110lh85cseoy13cgni7pet` 外键( `category_id` )参考文献 `tbl_category` ( `id` ))
nxagd54h

nxagd54h1#

这是因为级联,你正在申请 cascade = CascadeType.ALL .
因此,每当您删除任何产品时,jpa也会删除category id。如果该类别与任何其他产品都没有关联(在第二种情况下就是这样),那么它就可以很好地工作。但如果类别与任何其他产品关联,则外键约束将失败,说明您尝试删除的类别与其他产品关联。
在提到级联类型时,你应该非常小心。默认情况下,cascade mode是none,但是您可以根据您的需求提供不同的策略,比如update、persist等

相关问题