首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体ORM设计

实体ORM设计
EN

Stack Overflow用户
提问于 2022-04-17 21:59:38
回答 1查看 118关注 0票数 2

我有四个实体,一个大猩猩,一个健康检查,一个发送器和一个微芯片--我有一个关于把这些实体连接在一起的问题。

大猩猩每年进行3-4次健康检查,所以他们是OneToMany。在生活的过程中,每只大猩猩通常都有一个微芯片。微芯片是在健康检查期间插入的,但通常只有一个,除非其中一个脱落(罕见)。所以我把这个OneToMany也做在了大猩猩到微芯片上。每只大猩猩一次都有一个发射器,但每年都会更换。OneToMany也是。

我已经设置了这样的实体:

大猩猩大猩猩

代码语言:javascript
复制
@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<>();

微芯片

代码语言:javascript
复制
@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;

健康检查

代码语言:javascript
复制
@Data
public class HealthCheck {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private Gorilla gorilla;
    // other stuff

当将大猩猩实体视为一个列表或单个时,我通常会得到大猩猩的名称、当前发射机、当前微芯片,有时还有用于健康检查的汇总字段列表。

当查看HealthCheck时,需要检索带有大猩猩详细信息的任何微芯片或发射机,这些芯片或发射器都是在HealthCheck期间附加的。

目前与大猩猩有关系的微芯片和发射机的设计存在的问题是,用其当前(最近的)发射机和(最近的)微芯片很容易得到大猩猩。

然而,这种设计使得很难进行健康检查,并查看在健康检查上附加了哪些微芯片或发射机(如果有的话)。

例如,我获得最新微芯片的代码是:

代码语言:javascript
复制
   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以便:

我不需要每次都要查看大猩猩的发射机/微芯片列表--似乎非常in-efficent.

  • I可以检索与该healthcheck

  • Less公共相关的任何微芯片或发射器的健康检查列表,获得给定的大猩猩

的所有发射器/微芯片列表

(PS:我也尝试过坐在HealthCheck下的微芯片/变送器,但他们甚至很难获得当前的微芯片/发射机)

更新

我正在考虑有两个关系:大猩猩(一)到发射机(多) HealthCheck (一)到发射机(一和可选)

这样,我可以很容易地找到任何大猩猩的最新发射机(最新的名单),我可以看到哪一个健康检查发射机是在其中创建的。

有什么想法?

EN

回答 1

Stack Overflow用户

发布于 2022-04-18 08:27:50

我是误会了。如果变送器和微芯片只有在健康检查时才会改变,这种方法如何?

大猩猩

代码语言:javascript
复制
@Data
public class Gorilla {
    
    @OneToOne // unidirectional
    private Microchip currentMicroChip

    @OneToOne // unidirectional
    private Transmitter currentTransmitter

    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "gorilla")
    private List<HealthCheck> listHealthCheck = new ArrayList<>();

微芯片

代码语言:javascript
复制
@Data
public class Microchip {
   
    @ManyToOne(fetch = FetchType.LAZY, optional = true)
    private HealthCheck healthCheck;

健康检查

代码语言:javascript
复制
@Data
public class HealthCheck {

    @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<>();
   
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private Gorilla gorilla;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71905786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档