使用Spring Data时外键约束失败

时间:2018-08-15 16:55:30

标签: mysql spring spring-data

我正在使用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_dbtbl_product,约束FKfq7110lh85cseoy13cgni7pet   外键(category_id)参考tbl_categoryid))

1 个答案:

答案 0 :(得分:0)

这是因为您正在cascade = CascadeType.ALL进行级联。

因此,无论何时删除任何产品,JPA也会删除类别ID。如果该类别未与任何其他产品相关联,则效果很好(第二种情况就是这种情况)。但是,如果类别与任何其他产品相关联,则外键约束将无法说明您要删除的类别与其他产品相关联。

在提及级联类型时,您应该非常小心。默认情况下,级联模式为NONE,但是您可以根据需要提供不同的策略,例如UPDATE,PERSIST等。