首页 > 解决方案 > JPA 实体到 DTO 映射创建深拷贝

问题描述

我的班级结构如下

@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 类,但模型映射器再次为 List 字段调用 get,这导致休眠加载列表并再次在列表中列出等等。我可以做@JsonIgnore,但它完全忽略了对象列表。我想要做的是只返回特定级别的嵌套列表,而不是所有嵌套列表。喜欢

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

模型映射器中是否有任何方法可以仅将嵌套对象映射到某个级别而不是完整的对象本身

标签: javahibernatespring-data-jpamodelmapper

解决方案


推荐阅读