首页 > 解决方案 > 建模可选的一对多关系 - 我应该使用继承吗?

问题描述

我正在尝试对支持多个位置的天气服务进行建模。我的应用程序有 3 个实体:

  1. 位置 - 有关位置的信息
  2. 天气(包括位置 ID)- 一小时的天气数据
  3. 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;

标签: javaspring-bootspring-data-jpa

解决方案


弄清楚了。我在谷歌上搜索错误的东西。我应该一直在搜索“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/


推荐阅读