实体ORM设计

2024-02-28

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

大猩猩每年进行 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 以便:

  1. 每次我想要当前的发射器/微芯片时,我不必流式传输大猩猩的发射器/微芯片列表 - 似乎效率很低。
  2. 我可以检索健康检查列表以及与该健康检查相关的任何微芯片或发射器
  3. 不太常见的是获取给定大猩猩的所有发射器/微芯片的列表

(PS:我还尝试了位于 HealthCheck 下的微芯片/发射器,但他们甚至很难获得当前的微芯片/发射器)

UPDATE

我正在考虑建立两种关系: 大猩猩(一)到发射器(多) HealthCheck(一项)至发射器(一项且可选)

通过这种方式,我可以轻松找到任何大猩猩的最新发射器(列表中最新的),并且我可以看到发射器是在哪个健康检查中创建的。

想法?


我误会了。如果 Transmitter 和 Microchip 仅在健康检查期间更改,这种方法怎么样?

Gorilla

@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<>();

微芯片

@Data
public class Microchip {
   
    @ManyToOne(fetch = FetchType.LAZY, optional = true)
    private HealthCheck healthCheck;

健康检查

@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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体ORM设计 的相关文章

随机推荐

  • 将 .jar 文件添加到 git 存储库中

    我在 eclipse 上有一个项目 最近我创建了一个名为 lib 的新文件夹 并在其中添加了一些 jar 文件 我似乎无法将更改提交到 git 它只是没有出现在文件跟踪列表中 我已经从我的分支中的 gitignore 中删除了 jar 并提
  • 温莎城堡中的多个装饰器模式

    我们正在重新设计一些遗留软件以使其更具可测试性 并决定使用依赖注入和 Castle Windsor 来帮助我们 首先 我们的目标 许多装饰器都在数据流上工作 装饰器的多种组合是可能的 并且每种情况下的根节点可能需要从不同的地方获取数据 从技
  • ExpressJS:将参数传递给html不起作用

    这是我的server js var browserify require browserify middleware var express require express var app express var path require
  • 协作环境中实体框架的迁移

    我们有多个开发人员正在开发一个使用 Entity Framework 5 0 的项目 每个开发人员都使用自己的本地 SQL 2012 数据库 这样他就可以在不妨碍其他人的情况下进行开发和测试 起初 我们混合使用自动迁移和基于代码的迁移 这根
  • 有没有办法将 Google Analytics(分析)资产转移到新帐户?

    当我最初创建 Google 分析帐户时 我将所有网站 属性 添加到一个帐户中 现在我想将它们转移到他们自己的个人帐户 但我似乎找不到任何可用此选项的地方 我可以轻松创建一个新帐户 但这似乎需要创建一个新的属性和视图 如果可能的话 我想保留
  • 保护 CRTP:私有析构函数是唯一的解决方案吗?

    如何避免 template
  • Spring Security 中的 @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 与 ManagementServerProperties.ACCESS_OVERRIDE_ORDER

    问题1 在Spring Security中 到底有什么功能 Order SecurityProperties ACCESS OVERRIDE ORDER Spring文档说明如下 但我不确定我是否理解清楚 要覆盖访问规则而不更改任何其他自动
  • 为什么 SqlAzureExecutionStrategy 不处理错误:19 - 物理连接不可用

    完整异常 System Data Entity Core EntityCommandExecutionException An error occurred while executing the command definition Se
  • 用Java Unix 套接字连接到MySql 以避免JDBC 的TCP/IP 开销?

    是否可以使用 Java 建立与 MySql 的 Unix 套接字连接以避免 JDBC 的 TCP IP 开销 有谁知道一个图书馆 或几个图书馆 也许 可以实现这一点 此外 mySQL JDBC 驱动程序经过了很长一段时间的打磨 并进行了多项
  • 实施苹果推送通知的步骤是什么?

    我是这个主题的新手 需要一些指导来在我的应用程序中实现 Apple 推送通知 我已经创建了我的 appID 并为其配置了 Apple 推送通知 我已经下载了配置文件并在 iPhone 上安装了该应用程序 我还编写了Apple文档提供的以下代
  • 如何在路线更改时重置滚动位置?

    我在 Angular JS 上度过了最初的几个小时 并尝试用它编写 SPA 但是 在更改路线时 滚动位置在更改路线后仍保持在当前位置 这意味着 如果有人读完第二页上的一半文本 则在切换到第二页后 此人将在第二页时最终位于页面中间 假设页面同
  • Java 正则表达式提供任何性能优势吗?

    在Java中 当我们尝试使用正则表达式进行模式匹配时 例如获取输入字符串并使用正则表达式来确定它是否是数字 如果不是 则抛出异常 在这种情况下 我理解 使用正则表达式使代码比我们获取字符串的每个字符 检查它是否是数字 如果不是则抛出异常更简
  • Python 中的 RSS 提要解析器库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个好的 python 库来帮助我解析 RSS 提要 有人用过 feedparser 吗 任何
  • 如何在 Firemonkey 中加载自定义光标?

    我需要在我的 Firemonkey 桌面项目中使用自定义光标 我可以在 VCL 项目中使用 LoadCursorFromFile 在我的项目中加载自定义光标 我尝试对 Firemonkey 执行相同的操作 但它没有加载光标 有没有什么工作方
  • 如何使用 jQuery 清空输入字段

    我在移动应用程序中 使用输入字段来命令用户提交号码 当我返回并返回到输入字段显示输入字段中显示的最新数字输入的页面时 有没有办法在每次加载页面时清除该字段 shares keyup function payment 0 calcTotal
  • 如何在 Scala 中减去列表中的两个连续元素?

    我想用 Scala 中的数字减去列表中的两个连续元素 例如 我有这个清单 val sortedList List 4 5 6 我想要一个像这样的输出列表diffList 1 1 where 5 4 1 and 6 5 1 我尝试了以下代码
  • 无法使用 [self theMethod:] 调用类方法

    我正在尝试在 Objective C 中编写一个类方法 当我声明该方法时 该项目构建得很好 但每当我尝试调用该方法时 构建都会失败 这是我的代码 头文件 import
  • 使浅层 GIT 存储库变得不那么浅

    我为指定标签创建浅克隆 git clone branch v0 1 3 depth 1 file c usr sites smc 此后 克隆的存储库中仅包含标签 v0 1 3 和相关文件 它没有该标签之前或之后的所有更改的历史记录 据我所知
  • 在非常大的文件中快速搜索字符串

    在包含字符串的文件中搜索行的最快方法是什么 我有一个包含要搜索的字符串的文件 这个小文件 smallF 包含大约 50 000 行 如下所示 搜索字符串1字符串搜索2字符串搜索3 我必须在一个更大的文件中搜索所有这些字符串 大约1亿行 如果
  • 实体ORM设计

    我有四个实体 一个大猩猩 一个健康检查 发射器和一个微芯片 我有一个关于将这些实体连接在一起的问题 大猩猩每年进行 3 4 次健康检查 因此它们是 OneToMany 每只大猩猩normally在其生命过程中拥有 1 个微芯片 在健康检查期