Java JPA按实体或Id映射OneToOne

Java JPA按实体或Id映射OneToOne,java,hibernate,jpa,spring-data,Java,Hibernate,Jpa,Spring Data,以下映射的原因是什么 @Column(name = "inspection_platform_id") private Long inspectionPlatformEntityId; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "inspection_platform_id", insertable = false, updatable = false) private

以下映射的原因是什么

  @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,但我也看到了这种使用“急切获取”类型的方法,因此我不理解这样做的原因:

  • JPQL中关系上的JPA点符号“.”指定内部联接,或者必须显式定义要忽略的联接
一些提供程序可能会优化并理解
“从实体e中选择实体,其中e.inspectionPlatformEntity.id=:value”
不需要表联接,但您由JPA提供程序决定,并且必须了解FK存在于关系的哪一侧。拥有基本映射可以使它更清晰,并允许您在需要时精确定义所需内容

  • 序列化。在某些情况下,您可能希望在别处序列化ID,但不需要序列化对象。写出此对象时,由于inspectionPlatformEntity的联接列为insertable/Updateable=false,因此不需要将此引用对象与此实体一起序列化

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

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

  • 缓存。如上所述,通过序列化,我可能需要缓存该实体,在某些情况下,我希望使用它缓存引用的实体,或者在某些对象图中,能够在不丢失仍然存在的关系的知识的情况下将其清空


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