SpringBoot App 抛出 ava.sql.SQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败

问题描述

我正在用 Spring Boot 做一个小应用程序,当我尝试删除一个类别时抛出了这个错误,我把它放在了DeleteCascade 上,我正在搜索信息,但我找到的一切都不能解决我的问题,如果有人可以提供帮助我将不胜感激。

这是错误的一部分:

from django.db.models import F
from django.db.models.functions import ACos,Cos,radians,Sin

locations = Location.objects.annotate(
    distance_miles = ACos(
        Cos(
            radians(input_latitude)
        ) * Cos(
            radians(F('latitude'))
        ) * Cos(
            radians(F('longitude')) - radians(input_longitude)
        ) + Sin(
            radians(input_latitude)
        ) * Sin(radians(F('latitude')))
    ) * 3959
).order_by('distance_miles')[:10]

这是一些代码

实体板块

java.sql.sqlIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`platos`.`plato`,CONSTRAINT `FKd7wg8wh3ov5moo4er9jj4vd8b` FOREIGN KEY (`id_cat`) REFERENCES `categoria` (`id`))
    at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:117) ~[mysql-connector-java-8.0.22.jar:8.0.22]
    at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:97) ~[mysql-connector-java-8.0.22.jar:8.0.22]

实体类

package cf.victorlopez.platosrestaurantespring.models.entity;
import javax.persistence.*;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "plato")
public class Plato {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) /** Para auto_increment **/
    @Column(name = "id",updatable = false,nullable = false)
    private Integer id;
    @Column(unique=true)
    private String nombre;
    @Column
    private String descripcion;
    @Column
    private String foto;
    @NotNull
    @JoinColumn(name = "id_cat",nullable = false)
    @ManyToOne(optional = false,fetch = FetchType.EAGER,cascade = CascadeType.REFRESH)
    private Categoria categoria;

    public Plato() {
        this.id = -1;
        this.foto = "";
        this.nombre="";
        this.descripcion="";
        this.categoria = new Categoria();
    }

    public Plato(String nombre,String descripcion,String foto,Categoria cat) {
        this.id = -1;
        this.nombre = nombre;
        this.descripcion = descripcion;
        this.foto = foto;
        this.categoria = cat;
    }

    public Integer getId() {
        return id;
    }

    /** No permitimos modificar el id desde fuera ya que es de tipo autoincrement */
    public void setId(int id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        Plato plato = (Plato) o;

        return id == plato.id;
    }

    @Override
    public int hashCode() {
        return id;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Categoria getCategoria() {
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }
}

解决方法

试试这个:

@OneToMany(mappedBy = "categoria")
    private List<Categoria> categoria;
@ManyToOne(optional = false,fetch = FetchType.EAGER)
    private Categoria categoria;

在我的代码中,我没有指定级联,所有操作都在工作。