我有四个实体,一个大猩猩,一个健康检查,发射器和一个微芯片 - 我有一个关于将这些实体连接在一起的问题。
大猩猩每年进行 3-4 次健康检查,因此它们是 OneToMany。
每只大猩猩normally在其生命过程中拥有 1 个微芯片。在健康检查期间会插入微芯片,但通常只插入一个,除非有一个脱落(罕见)。所以我也在 Gorilla 到 Microchip 上做了这个 OneToMany。
每只大猩猩一次都有一个发射器,但每年都会更换。一对多也是如此。
我已经像这样设置了我的实体:
GORILLA
@Data
public class Gorilla {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@Column(unique = true)
@NotEmpty(message = "Name must not be null or empty")
private String name;
@JsonIgnore
@OneToMany (cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.MERGE, CascadeType.REFRESH}, orphanRemoval = true, mappedBy = "gorilla")
private List<Microschip> listMicroschip = new ArrayList<>();
@JsonIgnore
@OneToMany (cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.MERGE, CascadeType.REFRESH}, orphanRemoval = true, mappedBy = "gorilla")
private List<Transmitter> listTransmitter = new ArrayList<>();
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "gorilla")
private List<HealthCheck> listHealthCheck = new ArrayList<>();
微芯片
@Data
public class Microchip {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@Column(unique = true)
@NotEmpty(message = "Name must not be null or empty")
private String code;
private LocalDate dateInserted;
@ManyToOne(fetch = FetchType.LAZY, optional = true)
private Gorilla gorilla;
健康检查
@Data
public class HealthCheck {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
private Gorilla gorilla;
// other stuff
当以列表或单个形式查看大猩猩实体时,我通常会得到大猩猩的名称,current发射器、当前微芯片,有时还有用于健康检查的摘要字段列表。
查看 HealthCheck 时,希望检索包含 Gorilla 详细信息、在 HealthCheck 期间连接的任何微芯片或发射器。
与 Gorilla 相关的微芯片和发射器的当前设计的问题在于,它使得很容易获得具有当前(最新)发射器和(最新)微芯片的 Gorilla。
然而,这种设计使得很难进行健康检查并查看该健康检查上连接了哪个微芯片或发射器(如果有的话)。
例如,我获取最新微芯片的代码是:
default void helperMapping(Gorilla source, GorillaDTO target) {
if (!source.getListTransmitter().isEmpty()) {
Transmitter trans = (source.getListTransmitter()
.stream()
.max(Comparator.comparing(Transmitter::getDateAttached)).get());
target.setChannel(trans.getChannel());
target.setChannelOffset(trans.getChannelOffset());
}
我如何设置 ORM 以便:
- 每次我想要当前的发射器/微芯片时,我不必流式传输大猩猩的发射器/微芯片列表 - 似乎效率很低。
- 我可以检索健康检查列表以及与该健康检查相关的任何微芯片或发射器
- 不太常见的是获取给定大猩猩的所有发射器/微芯片的列表
(PS:我还尝试了位于 HealthCheck 下的微芯片/发射器,但他们甚至很难获得当前的微芯片/发射器)
UPDATE
我正在考虑建立两种关系:
大猩猩(一)到发射器(多)
HealthCheck(一项)至发射器(一项且可选)
通过这种方式,我可以轻松找到任何大猩猩的最新发射器(列表中最新的),并且我可以看到发射器是在哪个健康检查中创建的。
想法?