【问题标题】:JPA mapping OneToOne by Entity or By IdJPA 按实体或按 ID 映射 OneToOne
【发布时间】:2020-11-26 15:46:03
【问题描述】:

下面映射的原因是什么?

  @Column(name = "inspection_platform_id")
  private Long inspectionPlatformEntityId;

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "inspection_platform_id", insertable = false, updatable = false)
  private InspectionPlatformEntity inspectionPlatformEntity;

如果我们为整个实体指定映射并且我们可以轻松地从该实体中提取 ID,为什么还需要为外键指定映射。

我有一个建议,这是由于延迟加载,所以我们不需要获取整个实体只是为了提取它的 ID,但我也看到了这种 EAGER 提取类型的方法,所以我不明白原因

【问题讨论】:

  • 这是你的代码,为什么你有它?你不需要它,这里也不是有人告诉你正在采取的方法的优点的地方,但我可以试试;我告诉我们的开发人员这样做,因为我稍后会优化模型以确保永远不会获取引用的实体,并且可能需要引用 fk 值的查询不需要无意中强制表连接使用它。我可以调用 entity.inspectionPlatformEntityId = :value 或使用 entity.inspectionPlatformEntity.someOtherAttribute 并控制我自己发出的 SQL,而不是只有 entity.inspectionPlatformEntity.id

标签: java hibernate jpa spring-data


【解决方案1】:

这样做的原因:

  • JPA 点符号 '.' over JPQL 中的关系指定一个内连接,或者您必须明确定义该连接以被排除在外连接。

一些提供者可能会优化并理解"Select entity from Entity e where e.inspectionPlatformEntity.id = :value" 不需要表连接,但您受 JPA 提供者的摆布,并且必须了解 FK 存在于关系的哪一侧。拥有基本映射会使它更加清晰,并允许您在需要时准确定义您想要的内容。

  • 序列化。在某些情况下,您可能希望在别处序列化 ID,但不需要序列化对象。在写出这个对象时,因为inspectionPlatformEntity 的连接列是可插入/可更新=false,所以你不需要这个被引用的对象到处都用这个实体序列化。

  • 这使批量更新更加高效,因此您无需获取一堆 InspectionPlatformEntity 实例来检查它们是否存在并需要更新。我可以将该关系保留为空,JPA 将忽略它,不管是否懒惰。

  • 重构。我们的开发人员不知道他们是需要参考还是只需要 FK 值。让所有东西都通过那个参考对象迫使我总是把它加载到他们需要的地方。给他们 FK 值让我可以选择在某些用例中加载引用,或者让他们使用 FK 值来查找其他用例。他们在编写用例时不需要知道什么对他们的用例更有效,我们可以在确定应该做什么之前进行测试。

  • 缓存。根据上面的序列化,我可能需要缓存这个实体,并且在某些情况下希望引用的实体与它一起缓存,或者在某些对象图中,能够在不丢失仍然存在的关系的知识的情况下将其清空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2014-05-17
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多