springboot应用程序抛出ava.sql.sqlintegrityconstraintviolationexception:无法删除或更新父行:外键约束失败

pjngdqdw  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(481)

我正在用SpringBoot做一个小应用程序,当我试图删除一个类别并将其放入ondeletecascade时会抛出这个错误,我正在搜索信息,但我发现的一切都不能解决我的问题,如果有人能帮我,我将非常感激。
以下是部分错误:

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;
    }
}

实体类别

package cf.victorlopez.platosrestaurantespring.models.entity;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "categoria")
public class Categoria {
    @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;
    @OneToMany(mappedBy = "categoria",cascade = CascadeType.REMOVE)
    private List<Categoria> categoria;

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

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

    public Integer getId() {
        return id;
    }

    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;

        Categoria plato = (Categoria) 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;
    }
}
9bfwbjaz

9bfwbjaz1#

试试这个:

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

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

相关问题