我正在使用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";
}
}
现在,例如,如果Products
A有3个Category
,而Category
B有1个,那么我可以删除Category
B的那个。但是,如果我尝试删除其他任何一个,
无法删除或更新父行:外键约束失败 ({
product_db
。tbl_product
,约束FKfq7110lh85cseoy13cgni7pet
外键(category_id
)参考tbl_category
(id
))
答案 0 :(得分:0)
这是因为您正在cascade = CascadeType.ALL
进行级联。
因此,无论何时删除任何产品,JPA也会删除类别ID。如果该类别未与任何其他产品相关联,则效果很好(第二种情况就是这种情况)。但是,如果类别与任何其他产品相关联,则外键约束将无法说明您要删除的类别与其他产品相关联。
在提及级联类型时,您应该非常小心。默认情况下,级联模式为NONE,但是您可以根据需要提供不同的策略,例如UPDATE,PERSIST等。