Spring Boot-java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败
我得到这个错误,我不能解决这个问题 基于这个话题有很多答案,但都不适合我 目标是保存Spring Boot-java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败,java,spring-boot,hibernate,jpa,Java,Spring Boot,Hibernate,Jpa,我得到这个错误,我不能解决这个问题 基于这个话题有很多答案,但都不适合我 目标是保存Todo,然后保存TaskTodo(Task和Todo的连接表) 我试图保存并刷新Todo,然后保存TaskTodo,但失败了 有人能告诉我哪里出了问题吗 错误: @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class Assignment { @Id @GeneratedVal
Todo
,然后保存TaskTodo
(Task
和Todo
的连接表)
我试图保存并刷新Todo
,然后保存TaskTodo
,但失败了
有人能告诉我哪里出了问题吗
错误:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Assignment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
}
@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);
}
}
@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;
}
}
@Override
public void saveTodo(Todo todo, Long taskId) {
Task task = getTaskById(taskId);
todoRepository.saveAndFlush(todo);
TaskTodo taskTodo = new TaskTodo(task, todo);
taskTodoRepository.save(taskTodo);
}
java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败(todo
task\u todo
,约束FK8dn0kderp1dame65xsokdaavj
外键(todo\u 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;
}
@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);
}
}
@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;
}
}
@Override
public void saveTodo(Todo todo, Long taskId) {
Task task = getTaskById(taskId);
todoRepository.saveAndFlush(todo);
TaskTodo taskTodo = new TaskTodo(task, todo);
taskTodoRepository.save(taskTodo);
}
待办事项-域类:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Assignment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
}
@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);
}
}
@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;
}
}
@Override
public void saveTodo(Todo todo, Long taskId) {
Task task = getTaskById(taskId);
todoRepository.saveAndFlush(todo);
TaskTodo taskTodo = new TaskTodo(task, todo);
taskTodoRepository.save(taskTodo);
}
保存待办事项和任务待办事项的服务功能:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Assignment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
}
@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);
}
}
@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;
}
}
@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
可以保存。我设法找出了问题所在
服务功能应如下所示:
@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
。Todo
在此处创建:todoRepository.saveAndFlush(Todo)代码>Todo
在此处创建:todoRepository.saveAndFlush(Todo)代码>如果这与saveAndFlush有关,服务函数是否应该具有@Transactional注释?如果不使用saveAndFlush,这可能会对您的案例有所帮助?是的,它也有效。我发现即使没有@Transactional
它也能工作。关键是放置todo=todoRepository.save(todo)
如果这与saveAndFlush有关,服务函数是否应该有@Transactional注释?如果不使用saveAndFlush,这可能会对您的案例有所帮助?是的,它也有效。我发现即使没有@Transactional
它也能工作。关键是放置todo=todoRepository.save(todo)