java - 建模可选的一对多关系 - 我应该使用继承吗?
问题描述
我正在尝试对支持多个位置的天气服务进行建模。我的应用程序有 3 个实体:
- 位置 - 有关位置的信息
- 天气(包括位置 ID)- 一小时的天气数据
- LocationWeather - 包含天气列表的位置子类
我希望位置有时作为与天气不同的实体存在。这样我就可以在 Location 对象上公开 CRUD 操作,而无需携带其所有天气数据的膨胀。但是,我仍然希望满足返回给定位置天气的主要用例,这就是 LocationWeather 存在的原因。
我想做的事情可以通过继承来完成吗?我试过了
@Entity
@Table(name="location")
@Inheritance(strategy = InheritanceType.JOINED)
public class Location {
但我的子类(LocationWeather)不直接与表关联。我是否应该将我的天气列表移动到 Location 对象并以某种方式将其标记为可选?
位置.java
@Entity
@Table(name="location")
public class Location {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="location_id")
private int id;
@Column(name="name")
private String name;
天气.java
@Entity
@IdClass(WeatherId.class)
@Table(name="weather")
public class Weather {
@Id
@Column(name="location_id")
private int locationId;
@Id
@Column(name="time")
private Date time;
@Column(name="temperature")
private Double temperature;
LocationWeather.java
@Entity
public class LocationWeather extends Location{
@ElementCollection
@CollectionTable(name="weather", joinColumns= {@JoinColumn(name="location_id")})
@Column(name="weather")
private List<Weather> weather;
解决方案
弄清楚了。我在谷歌上搜索错误的东西。我应该一直在搜索“2 个实体 1 个表”
我能够通过创建 @MappedSuperclass 并将 Location 和 LocationWeather 创建为它的子类来解决该问题。
我现在有:
MappedLocation.java
@MappedSuperclass
public class MappedLocation {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="location_id")
private int id;
@Column(name="name")
private String name;
位置.java
@Entity
@Table(name="location")
public class Location extends MappedLocation {
}
LocationWeather.java
@Entity
public class LocationWeather extends MappedLocation{
@ElementCollection
@CollectionTable(name="weather", joinColumns= {@JoinColumn(name="location_id")})
@Column(name="weather")
private List<Weather> weather;
更多信息:https ://thoughts-on-java.org/hibernate-tips-map-multiple-entities-same-table/
推荐阅读
- java - Java8 Streams:如何保留map之前的值以供collect / groupingBy函数访问
- javascript - JavaScript 中的耳机按钮事件检测
- c# - 如何在c# unity中更改图像组件的图像源?
- javascript - 是否可以从 react-native 中的图像中提取 RGB?
- cron - 如何每 N 分钟执行一次 Google Cloud Run 服务?
- java - 通过 androidstudio 创建的 Android 应用程序的工具栏上未显示菜单按钮
- powerbi - 如何根据当前 Power Bi 页面在管理角色中实现不同的规则?
- c# - Task 在异步任务中完成后没有执行任何语句,但几乎相同的异步任务工作得很好
- javascript - 铯JS中的遮挡剔除
- linux - Git Bash 输出中的彩色文本