jpa按实体或按idMaponetoone

nkhmeac6  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(347)

以下Map的原因是什么?

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

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

如果我们为整个实体指定了Map,并且可以轻松地从该实体提取id,那么为什么我们需要为外键指定Map呢。
我有一个建议,这是由于延迟加载,所以我们不需要提取整个实体只是提取它的id,但我也看到了这种方法与渴望获取类型,所以我不明白的原因

fivyi3re

fivyi3re1#

这样做的理由:
jpql中关系上的jpa点符号“.”指定一个内部联接,或者必须显式定义要忽略的联接。
一些提供者可能会优化并理解 "Select entity from Entity e where e.inspectionPlatformEntity.id = :value" 不需要表联接,但是您可以由jpa提供者决定,并且必须了解fk存在于关系的哪一边。拥有基本的Map可以让它更清晰,并且允许您在需要时精确地定义所需内容。
序列化。在某些情况下,您可能希望在其他地方序列化id,但不需要序列化对象。写出此对象时,由于insertable/updateable=false是insertable/updateable,因此不需要将此引用对象与此实体一起序列化。
这使得批量更新更加有效,因此您不需要获取一堆inspectionplatformentity示例来检查它们是否存在并需要更新。我可以把这个关系设为null,jpa就会忽略它,不管是不是懒惰。
重构。我们的开发者不知道他们是需要参考还是仅仅需要fk值。让所有的东西都通过那个引用对象迫使我总是把它加载到他们需要的地方。给他们fk值让我可以选择在某些用例中加载引用,或者让他们在其他用例中使用fk值来查找引用。在编写用例时,他们不需要知道什么对他们的用例更有效,我们可以在确定应该做什么之前进行测试。
缓存。根据上面的序列化,我可能需要缓存这个实体,在某些情况下,我希望使用它缓存被引用的实体,或者在某些对象图中,能够在不丢失仍然存在的关系的知识的情况下将其清空。

相关问题