java.sql.sqlintegrityconstraintviolationexception:无法添加或更新子行:外键约束失败

a14dhokn  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(316)

我得到这个错误,我不能解决这个问题。
基于这个主题的答案很多,但都不适合我。
我们的目标是拯救 Todo 然后保存 TaskTodo (连接表) Task 以及 Todo ).
我试着拯救和冲水 Todo 然后保存 TaskTodo ,但失败了。
有人能告诉我哪里出了问题吗?
错误:
java.sql.sqlintegrityconstraintviolationexception:无法添加或更新子行:外键约束失败( todo . task_todo ,约束 FK8dn0kderp1dame65xsokdaavj 外键( todo_id )参考文献 todo ( id ))
赋值-父抽象类:

@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);
}
eivnm1vs

eivnm1vs1#

我设法找出了问题所在
服务功能应如下所示:

@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 可能会得救。

相关问题