【问题标题】:JPA/Hibernate: What use is an ORM (Hibernate) when it doesn't get all JPA mappings right?JPA/Hibernate:当 ORM (Hibernate) 不能正确获取所有 JPA 映射时,它有什么用?
【发布时间】:2011-05-19 02:33:23
【问题描述】:

在过去的几个月/几周里,我玩了很多 Hibernate 和 JPA 映射。我的数据库使用复合主键,我报告了大约 10 到 15 个 Hibernate 和 5-10 个 EclipseLink 错误。在某些应该工作的星座中,休眠尤其可笑。 (我让专家和 JPA 书籍作者检查了代码)

最大的问题是:

如果 ORM 不能正确获得 所有 JPA 映射,它还有什么用处?

Hibernate 有很多东西可以提供,缓存等等。我想知道当开发人员甚至无法通过创建一个工作元数据模型时谁在乎......这一切都毫无意义。再说一遍,当 ORM 不能获得 所有 JPA 映射时,它还有什么用处?

【问题讨论】:

  • 我已经在多个项目中使用了 4 年的 hibernate,并且没有遇到任何重大问题。所以问题应该是你;)
  • 当我使用 Hibernate 和 EclipseLink 对 4 种可能的复合主键变体 JPA 1.0 @IdClass、JPA 1.0 @EmbeddedId、JPA 2.0 @IdClass 和 JPA 2.0 @EmbeddedId 进行了广泛的测试时,问题出在肯定是 Hibernate 糟糕地处理复合键。您要么不使用复合主键,要么使用 JPA 1.0 @IdClass 实现。这些是 Hibernate (3.6) 中唯一稳定的。
  • 这是诱饵。在我看来,除了“是的,你是对的!任何不实现完整 JPA 2 规范的 ORM 都是无用的”,我似乎没有对任何其他答案持开放态度。在我看来,您只是想发泄对 Hibernate 的不满,并希望得到其他人的安慰。 SO 不适合进行这种交流。
  • 是的,我想让别人放心。像 EclipseLink 这样的其他 ORM 也有仍然让我摸不着头脑的错误。它不仅与 Hibernate 有关,而且与所有 JPA ORM 有关。在映射方面,Hibernate 是迄今为止最容易出错的一个。当 JPA 提供者不明白没有所有 JPA 映射工作的新手最终会认为 JPA 和 ORM 是无用的技术时,软件的其余部分将变得无用。我的任务是改进 JPA 的实现。
  • 我很难找出 Hibernate 和 EclipseLink 的问题所在。我意识到它们在某种程度上都是错误的/不完整的,我开始想知道这样的软件有什么用。让 4 个复合主键变体中的 1 个起作用并不令人满意,它们全部都必须起作用。

标签: java hibernate orm jpa mapping


【解决方案1】:

ORM 是一种工具。深思那句话。

通常认为,如果一项技术(在这种情况下为 Hibernate)在特定领域变得足够流行,它就是灵丹妙药,你必须使用它,否则你就是失败者。

这显然是完全错误的。 Hibernate 是一个应该适当使用的工具。

Hibernate 的作者说 Hibernate 最适合新项目,其中映射在 xml 中定义或使用注释,然后 Hibernate 为您的数据库生成 DLL 并创建所有表和关系。

反过来可能会非常棘手,尤其是当您有非规范化表和复合主键时。

这就是为什么 Hibernate 强烈鼓励使用自动递增的主代理键。

执行正确的 JPA 反向映射是一项挑战,许多极端情况都在等着您,因此您可以通过报告所有这些错误以便修复它们来做正确的事情。有了更多的坚持,我相信你将能够完美地完成映射,然后之后的一切都会变得容易得多,因为第一部分总是最难的。

【讨论】:

  • 我认为使用代理键的建议只是暗示他们在正确获得复合键映射时遇到了问题。在过去的几周里,我使用 JPA 1.0 和 JPA 2.0 以及 @IdClass 和 @EmbeddedId 复合键类映射进行了广泛的测试。结果:Hibernate 只管理 4 个中的 1 个(JPA 1.0 @IdClass),而 EclipseLink 管理 4 个中的 3 个(JPA 1.0 @IdClass、JPA 1.0 @EmbeddedId 和 JPA 2.0 @IdClass),这使得 Hibernate 几乎无用并且对开发人员非常不友好(很难调试真正的原因),最终使 Hibernate 成为市场上的第二选择。
  • 我不会因为 ORM 工具劣质而更改我的数据库,但我宁愿切换到另一个工作得更好或至少修复任何错误的工具。您有时会在他们的论坛上遇到 EclipseLink 开发人员,他们敦促我创建错误报告。 Hibernate 从来没有发生过同样的事情,所以你会感觉到 Hibernate 开发人员在做其他事情。我认为当前端(映射!)不能令人满意地工作时增强软件的后端部分是非常愚蠢的......
  • @Kawu:也许 Hibernate 开发人员忙于改进和修复 Hibernate,而不是敦促您创建错误报告。
  • 我在过去几个月提交的 10-15 个错误报告都没有收到状态更新甚至评论。当您在 JBoss 站点上四处走动并观看那里跟踪的活动时,它主要是关于处理缓存算法和其他高级内容的软件片段。我不会在不知情的情况下责怪他们……
  • 我会创建错误报告,即使没有被要求这样做。不同之处在于,这让你感觉有人真的对你的问题感兴趣。 Hibernate 错误跟踪器目前只是一个黑洞,你可以把东西扔进去......
【解决方案2】:

无论我在使用 JPA 时遇到什么问题,我都会为所有实现创建一个测试用例,并比较 ORM 的行为及其社区的反应。 Hibernate 是迄今为止最糟糕的——他们的 JPA 错误甚至没有被查看。 OpenJPA 在功能方面有点落后于 EclipseLink,但它看起来很稳定。 EclipseLink 有仍然需要一些时间的错误,但有活动和频繁升级。我在邮件列表中的问题均由 Oracle 人员以专业的方式回答。目前看来,EclipseLink 是赢家。我使用复合主键没有问题——没有它们我仍然需要二级唯一索引。能够通过复合键查找实体非常有用,因此代理键解决方法似乎是我的借口。在 EclipseLink 中,甚至可以使用枚举作为主键,这对于控制系统行为的众多小查找表非常有用。见http://opensource.atlassian.com/projects/hibernate/browse/JPA-7

【讨论】:

  • 感谢您的发言。我真的很高兴你提到了 Hibernate 上的 ENUM PK 问题,我会为我的下一个数据库扩展中的一个表创建这个问题。
  • 更新:Hibernate 中的“没有 ENUM 作为 PK 问题”似乎已经解决。我刚刚用 Hibernate 3.6.0 尝试过。使用 em.find(...) 查找在其复合 PK 中具有 ENUM 的实体没有问题。
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2013-12-15
  • 2019-02-24
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多