![](/img/trans.png)
[英]getting java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
[英]Spring Boot - java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
我收到此错误,无法解决此问题。
有很多基于这个主题的 StackOverflow 答案,但没有一个适合我。
目标是保存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);
}
我设法弄清楚是什么问题
服务功能应该是这样的:
@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.