【问题标题】:JPA OneToOne relationship to two different typesJPA OneToOne 与两种不同类型的关系
【发布时间】:2018-04-06 10:24:03
【问题描述】:

我正在使用 Hibernate JPA 实现将关系数据库映射到我的模型对象。

请看简图:

在我的应用程序中,我需要一位客户一次拥有一个植入物或一个假体,并非两者都可以。我想在我的客户模型中只有一个字段来链接假体或植入物,这很好,但我不知道如何..

目前,我正在考虑不使用任何关系映射,并将客户字段设置为:

  • 字段“类型”:植入物或假体
  • 字段“prosthesis”:可为空
  • 字段“植入”:可为空

并根据类型的值执行 JPQL 查询以获取 DTO(如果类型是 Prosthesis,则语法 new my.package.dto.Prosthesis(...) from Prosthesis,对于 Implant,依此类推)。

除非您证明我错了,否则即使客户的类型是 Implant,关系映射也可能会尝试连接客户表和假体表。我想避免这种不必要的查询。

SO 社区有什么优化建议吗?

非常感谢

【问题讨论】:

  • 我也认为映射关系将使用 JOIN 处理,但我认为 @OneToOne 关系,正如您的模型所暗示的那样,因为它们与连接的 ID 匹配,所以足够快。
  • @Guillem 是的,但它会导致两个具有@OneToOne 关系的字段,这将执行两个连接查询。也许如果我把 LAZY 放在他们两个身上?我要测试
  • 我认为 LAZY 仅适用于 OneToMany 或 ManyToMany,以便将获取“延迟”到调用变量的那一刻,但不适用于 OneToOne。无论如何,根据我的经验,获取 OneToOne 关系很快,因为它使用 JPA Id 主键。

标签: java hibernate jpa jakarta-ee orm


【解决方案1】:

如果您的表植入物和假体未简化,您可以合并它们,如果您不介意使用空值。因此,在您的客户表中,您只有一个链接到假体或植入物的字段,确保一次只有一种类型。然后您的 genericWordAboutImplantAndProsthesis 表将如下所示:

  • genericWordAboutImplantAndProsthesisId
  • 品牌
  • 型号
  • 生产日期
  • 供电(空)
  • 位置(空)

您可以添加您提到的字段类型,也可以根据哪个字段(供电或位置)不为空来推断它。

【讨论】:

  • 是的,我已经考虑过了,感谢您的建议,不幸的是,这里每个类都有更多特定的字段,所以我认为抽象可能不是一个好主意,因为我想放一些数据库对他们的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多