我想把学生对象-它没有id-保存到数据库中。但是,学生对象有几个子对象-它们的id是-。
我怎样才能保存父对象在一次没有得到子对象的引用和Map到父对象。
public class Student{
//...
@ManyToOne
@JoinColumn(name = "school_id")
School school;
@ManyToOne
@JoinColumn(name = "course_id")
Course course;
//...
}
以及
public class School {
//...
@OneToMany(mappedBy = "school")
List<Student> students
//...
}
public class Course{
//...
@OneToMany(mappedBy = "course")
List<Student> students
//...
}
服务层
public Student saveStudent(Student student) {
//...
return studentRepository.save(student);
}
当我试图保存学生对象,其中有学校对象和课程对象只有id属性,它抛出这个错误,因为学校对象没有引用。
对象引用未保存的临时示例-刷新前保存临时示例
如果学校对象有版本号和ID号,它就可以正常工作。
我不想更新或插入新的学校对象。
所以我试了级联。所有,级联。合并,级联。持久,什么都不起作用。我试了覆盖等于和散列码只基于id。不起作用。
我的目标是
我的数据库中有几个学校对象,当一个新学生注册时,学生对象将把学校作为一个对象,最后,我将保存学生对象,jpa将学生与学校ID上的学校关联起来。
学生的 Postman 帖子示例。//失败的请求对象示例{ //..“id”:null,“school”:{“id”:12},“course”:{“id”:21}
//...
}
//...
//succesfull request object sample
{
//...
"id":null,
"school":{"id":12, "version": 0},
"course":{"id":21, "version": 0}
//...
}
如果学校和课程对象具有版本(@Version)属性,则这些对象将成功合并到学生对象,而无需获取子对象引用并Map到父对象。
第二个投递请求对象保存成功,建立父子关系
为什么jpa需要版本号来合并父代和子代?
1条答案
按热度按时间6ojccjat1#
您没有在执行保存的位置显示服务层,但我怀疑您没有将实体附加到student。仅仅在POJO上设置id并不能使其对持久性上下文可用,这就是为什么您会遇到这个异常。
伪服务层实现如下所示: