Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Boot-java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败_Java_Spring Boot_Hibernate_Jpa - Fatal编程技术网

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)