【发布时间】: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 并使用它?
-
您可以将两个实体类映射到同一个表 - 一个包含完整信息,另一个仅包含摘要信息(如果需要,
id和name)。然后,您可以将仅包含摘要信息的实体标记为@Immutable,以便无法通过其实例更改基础表。最后,通过延迟加载将两个实体映射到关联实体,并使用合适的实体。
标签: hibernate spring-boot spring-data-jpa