如何更新 MongoDB @DbRef 嵌入式集合?

问题描述

所以,我正在尝试使用 spring-data-mongodb 进行 MongoDB CRUD 操作。下面是我的模型类,

@Document(collection = "alumni_students")
public class AlumniStudent {

    @Id
    private String id;

    private String firstName;
    private String lastName;
    private String email;

    @DBRef
    private AlumniDepartment alumniDepartment;
    
    @DBRef
    private List<AlumniSubject> alumniSubjects;
    
    ... getters/setters


@Document(collection = "alumni_department")
public class AlumniDepartment {

    @Id
    private String id;
    
    private String departmentName;

    private String location;

    ... getters/setters


@Document(collection = "alumni_subjects")
public class AlumniSubject {
    
    @Id
    private String id;

    private String subjectName;
    
    private int marks;

    ... getters/setters

我将 MongoRepository 用于单个集合的操作,如下所示,

@Repository
public interface AlumniStudentRepository extends MongoRepository<AlumniStudent,String> { }

@Repository
public interface AlumniDepartmentRepository extends MongoRepository<AlumniDepartment,String> {}

@Repository
public interface AlumniSubjectRepository extends MongoRepository<AlumniSubject,String> {}

到目前为止,我在创作和获取学生详细信息方面做得很好。我面临的问题是更新学生数据时。尤其是在更新数据时,我很困惑。

下面是我在服务层的更新代码

@Autowired    
AlumniStudentRepository alumniStudentRepo;    
@Autowired    
AlumniDepartmentRepository alumniDeptRepo;    
@Autowired    
AlumniSubjectRepository alumniSubjRepo;

 public AlumniStudent updateStudent(AlumniStudent student,String id) {
      Optional<AlumniStudent> fetchedStudent = alumniStudentRepo.findById(id);
      **// UPDATE STUDENT DATA,WORKS FINE**
      if (fetchedStudent.isPresent()) {
          AlumniStudent studentFromDB = fetchedStudent.get();
          studentFromDB.setFirstName(student.getFirstName());
          studentFromDB.setLastName(student.getLastName());
          studentFromDB.setEmail(student.getEmail());

      **// UPDATE DEPARTMENT DATA,WORKS FINE**
      if (student.getAlumniDepartment() != null) {
          Optional<AlumniDepartment> deptData = alumniDeptRepo.findById(studentFromDB.getAlumniDepartment().getId());
          if (deptData.isPresent()) {
              AlumniDepartment alumniDepartment = deptData.get();
              alumniDepartment.setDepartmentName(student.getAlumniDepartment().getDepartmentName());
              alumniDepartment.setLocation(student.getAlumniDepartment().getLocation());
              alumniDeptRepo.save(alumniDepartment);
              studentFromDB.setAlumniDepartment(alumniDepartment);
          }
      }
      
      **// UPDATE SUBJECTS ARRAY DATA.... HOW TO DO THIS?**
      if (student.getAlumniSubjects() != null && !student.getAlumniSubjects().isEmpty()) {
          
       // Problematic area. How to perform update of arraylist here?


      }
      return alumniStudentRepo.save(studentFromDB);
      }
  }

这是邮递员点击的网址:

本地主机:8080/校友/60aa384ffbf1851f56c71bef

这是请求正文:

{
   "firstName": "Babita","lastName": "Raman","email": "babita@gmail.com","alumniDepartment": {
        "departmentName": "Android Developer","location": "dubai"
    },"alumniSubjects": [
        {
            "subjectName": "Java","marks": 80
        },{
            "subjectName": "Unit testing","marks": 60
        },{
            "subjectName": "Docker","marks": 80
        }
    ]
}

我尝试了一些随机代码,但结果是

无法创建对 ID 为 NULL 的对象的引用。

这里有人可以帮助更新被引用为 @DbRef 的数组数据吗?

先谢谢大家。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...