hibernate 如何关联嵌套对象(数据库中存在)与父对象的ManyToOne关系?

qyuhtwio  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(147)

我想把学生对象-它没有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需要版本号来合并父代和子代?

6ojccjat

6ojccjat1#

您没有在执行保存的位置显示服务层,但我怀疑您没有将实体附加到student。仅仅在POJO上设置id并不能使其对持久性上下文可用,这就是为什么您会遇到这个异常。
伪服务层实现如下所示:

public Student saveStudent(Student student) {  // where the student is the object passed in
  School school = schoolRepository.findById(student.getSchool().getId());
  Course course = courseRepository.findById(student.getCourse().getId());

  student.setCourse(course);
  student.setSchool(school);

  return studentRepository.save(student);

}

相关问题