【问题标题】:JPA/Hibernate: What's better for composite primary keys, @IdClass or @EmbeddedId implementations and why? [duplicate]JPA/Hibernate:复合主键、@IdClass 或 @EmbeddedId 实现哪个更好,为什么? [复制]
【发布时间】:2010-10-26 14:37:25
【问题描述】:

对于 JPA/Hibernate 复合主键、@IdClass@EmbeddedId 实现,什么更好,为什么?

这是一个故意天真的问题。我决定使用@EmbeddedId(无论出于何种原因),我觉得我做出了错误的选择。取消引用包含列属性的 embeddedId 是多余的,并且在编码时很容易出错。

还有其他理由支持和/或反对对方吗?这是 JPA(规范)的推荐吗?

【问题讨论】:

  • 看来是。但它没有列出更多原因。

标签: java hibernate jpa composite-primary-key


【解决方案1】:

首先,如果可能,不惜一切代价避免使用复合 ID。但如果你真的需要,我会推荐@EmbeddedId

@IdClass 基本上是 EJB 2.1 时代的遗留物,以便更容易地从 BMP 迁移。在其他一些罕见的极端情况下,它也可能比@EmbeddedId 更好。不过一般@EmbeddedId更好更OO,因为它把os这个key的概念封装在了对象里面好很多。

如果您需要在关键字段中使用@AttributeOverride(s),可能需要使用。

我不明白你为什么认为取消引用嵌入的 id 是多余的并且容易出错。

【讨论】:

  • 是的,你的最后一句话是对的。如果使用 JPA 2.0 语法,实体类上不会有任何冗余字段,因此您必须始终取消引用连接列,这对于所有 4 个复合键 vatiants JPA 1.0 @IdClass 来说似乎更可取, JPA 1.0 @EmbeddedId、JPA 2.0 @IdClass 和 JPA 2.0 @EmbeddedId。
  • 你能解释一下为什么复合 ID 不好?
【解决方案2】:

正如帕斯卡所写,这是答案的一部分:

Which annotation should I use: @IdClass or @EmbeddedId

最后,我相信在实践中使用@IdClass 要容易得多,因为您必须添加embeddedId 属性名称才能取消引用PK 属性,而这些并不是为所有非PK 属性编写的。

您始终必须准确记住哪些属性是 PK 的一部分,哪些不是。这会使编写 JPQL 查询变得不必要地复杂化。

此外,AFAIK JPA 2.0 规范允许您将 @Id 放在 @XToX/@JoinColumn/s 属性上,并引入了 @MapsId 注释,以便映射识别关系(也称为 JPA 中的派生标识符)实施起来更自然。

【讨论】:

    【解决方案3】:

    我。记得使用 idclass 来做。但我建议尽你所能避免多字段键。他们只是创造了额外的工作。

    【讨论】:

    • 给 +1 因为它确实让我们重新评估了使用复合 PK 并得出结论,如果没有它们,我们会好得多。
    • 有时——尤其是在使用遗留模式时——正确映射实体的唯一方法是使用复合 PK。当然,在设计新架构时最好避免使用它们(如果可能的话)。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多