【问题标题】:Spring Boot Entities(Too Big Object)Spring Boot 实体(太大的对象)
【发布时间】:2017-09-05 06:05:07
【问题描述】:

我在 Spring Boot 中使用 Spring Data JPA(Hibernate)

我有两个数据库表。第一个是课程表,第二个是学院表。 两张表都有大约 20 列。

现在我的课程表有一个名为 parent_id 的列,它是学院表的 id。

我已经设计了我的两个实体,指定了 JOIN 列,并且数据也被提取并且我的对象已经准备好了。

但问题是我不想要课程对象内的完整学院对象,我只想要学院 id(listing_id) 和名称。如何设计我的实体。

课程实体

@Entity
@Table(name="courses")
public class Course implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    @Column(name="course_id")
    private int courseId;

    private String status

    .. Other Properities...

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="parent_id", referencedColumnName="listing_id",insertable=false,updatable=false),
        @JoinColumn(name="status", referencedColumnName="status",insertable=false, updatable=false),
      })
    @Where(clause="status='live'")
    private Institute institute;

    .. Getters & setters

}

研究所实体

@Entity
@Table(name="institutes")
public class Institute implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    @Column(name="listing_id")
    private int listingId;

    private String status;

    @OneToMany(mappedBy="institute")
    private List<Course> Courses;

    .. Other Properties

    .. Getters & Setters

}

【问题讨论】:

  • 您只想要“光”研究所对象在哪个级别?在实体级别上还是在实体被序列化为 JSON 并在 REST API 中返回时?
  • 在实体级别,当实体实际被创建时。我也很想知道当实体被序列化为 JSON 并在 REST API 中返回时该怎么做(仅用于我的学习目的)。
  • 如果您只需要实体中的某些字段,只需删除您不需要的所有其他字段。关于 JSON 序列化:查看@JsonView 注释。
  • 我无法从研究所实体中删除它们,因为我在不同的地方单独使用研究所对象。只有当我获取课程对象时,我才需要光学院对象。可以通过某种方式使用 Projections 来完成吗?通过创建一个单独的 Institute Projection 并使用它?
  • 您可以将两个实体类映射到同一个表 - 一个包含完整信息,另一个仅包含摘要信息(如果需要,idname)。然后,您可以将仅包含摘要信息的实体标记为@Immutable,以便无法通过其实例更改基础表。最后,通过延迟加载将两个实体映射到关联实体,并使用合适的实体。

标签: hibernate spring-boot spring-data-jpa


【解决方案1】:

您可以声明一个 CourseDTO 对象。

public class CourseDTO {
  private int listingId;
  private String name;

  Get and set method ...
}

学院实体有很多课程。您可以选择一个pojo。例如,

@Query("select new com.pakcage.name.CourseDTO(c.id, c.courseId, i.listingId, i.name) from Course c join Institute i where c.id=:id")
public CourseDTO fetchCourse(@Param("id") Long id);

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2021-09-15
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多