繁体   English   中英

Spring Boot - java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败

[英]Spring Boot - java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails

我收到此错误,无法解决此问题。

有很多基于这个主题的 StackOverflow 答案,但没有一个适合我。

目标是保存Todo ,然后保存TaskTodo (连接TaskTodo表)。

我尝试保存并刷新Todo ,然后保存TaskTodo ,但失败了。

有人能告诉我问题出在哪里吗?

错误:

java.sql.SQLIntegrityConstraintViolationException:不能添加或更新子行,外键约束失败( todotask_todo ,约束FK8dn0kderp1dame65xsokdaavj外键( todo_id )参考todoid ))

分配 - 父抽象类:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Assignment {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;

}

Todo - 域类:

@Entity
public class Todo extends Assignment {

    private boolean isChecked;

    @OneToMany(mappedBy = "todo")
    Set<TaskTodo> taskTodoSet;
}

任务 - 域类:

@Entity
public class Task extends Assignment {

    private String description;

    @OneToMany(mappedBy = "task")
    public
    Set<TaskTodo> taskTodoSet;

    public Task() {}

    public Task(String name) {
        this.setName(name);
    }
}

TaskTodo - 域类:

@Entity
public class TaskTodo {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @ManyToOne
    @JoinColumn(name = "task_id")
    Task task;

    @ManyToOne
    @JoinColumn(name = "todo_id")
    Todo todo;

    public TaskTodo(Task task, Todo todo) {
        this.task = task;
        this.todo = todo;
    }
}

保存 Todo 和 TaskTodo 的服务功能:

@Override
public void saveTodo(Todo todo, Long taskId) {
    Task task = getTaskById(taskId);
    todoRepository.saveAndFlush(todo);
    TaskTodo taskTodo = new TaskTodo(task, todo);
    taskTodoRepository.save(taskTodo);
}

我设法弄清楚是什么问题

服务功能应该是这样的:

@Override
public void saveTodo(Todo todo, Long taskId) {
    Task task = getTaskById(taskId);
    todo = todoRepository.saveAndFlush(todo); // This line is changed
    TaskTodo taskTodo = new TaskTodo(task, todo);
    taskTodoRepository.save(taskTodo);
}

原因是因为作为参数发送的Todo本身没有 id,因此出现了错误。

当我把todo = todoRepository.saveAndFlush(todo); , saveAndFlush返回本身具有 id 的对象。 因为可以保存TaskTodo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM