JPA объекты в DTO отображают создание глубокой копии - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть структура классов, как показано ниже

@Entity
@Table(name = "CourseGroups")
public class CourseGroup {

    @Id
    @GeneratedValue
    long courseGroupId;

    @OneToMany(mappedBy = "courseGroup")
    @JsonManagedReference
    List<Course> courseList;

    //Getters and Setters
}

@Entity
@Table(name = "Course")
public class Course {

    @Id
    @GeneratedValue
    long courseId;

    @ManyToOne
    @JoinColumn(name = "courseGroupId")
    @JsonBackReference
    CourseGroup courseGroup;

    @OneToMany(mappedBy = "course",fetch = FetchType.LAZY)
    @JsonManagedReference
    List<CoursePart> courseParts;
}

@Entity
@Table(name = "courseParts")
public class CoursePart {
    @Id
    @GeneratedValue
    long  partId;

    @ManyToOne
    @JoinColumn(name = "courseid")
    @JsonBackReference
    Course course;

    @ManyToMany(mappedBy = "coursePartList")
    List<Subject> subjectsList;
}

Чтобы вернуть результаты REST, я создал классы DTO с почти одинаковыми полями. Мой основной мотив состоял в том, чтобы избежать бесконечного вложения объектов, когда я напрямую возвращаю сущности JPA из контроллера.

courseGroup{
  groupId,
   courseList:[
    { 
      courseId , 
      partList:[
                 {
                  partId,
                  subjectList:[ //Again Subject and So on]
                 }] 
     }
    ]
}

Итак, я использовал ModelMapper для сопоставления сущностей с классами DTO, но mapper модели снова вызывает get для полей List, что вызывает hibernate для загрузки списков и снова list in list и так далее. Я могу сделать @JsonIgnore, но он полностью игнорирует список объектов. Что я хочу сделать, это вернуть только определенный уровень вложенных списков, а не все вложенные списки. как

courseGroup{
  groupId,
   courseList:[
    { 
      courseId , 
      partList:[
                 {
                  partId, subjectId}] 
     }
    ]
}

Есть ли способ в модели картографа для отображения вложенных объектов только до определенного уровня и не завершить сам объект

...