39

I have not used Spring Data before but I've used Hibernate ORM a number of times for MySQL based application. I just don't understand which framework to choose between the two for a MongoDB based application.

I've tried searching for the answer but I can't find the answer which does a comparison between the two in a production environment. Has anyone found problems working with these two frameworks with MongoDB ?

4

3 回答 3

57

免责声明:我是 Spring Data 项目的负责人,所以我将主要介绍 Spring Data 方面的内容:

我认为这两个项目的核心区别在于 Hibernate OGM 团队选择将精力集中在 JPA 上,而 Spring Data 团队明确没有。原因如下:

  • JPA 本质上是一种关系 API。规范的前两句话指出,它是一个用于对象关系映射的 API。这也体现在 API 的核心主题中:它讨论了表、列、连接、事务。不一定可以转移到 NoSQL 世界的概念。
  • 您通常选择 NoSQL 存储是因为它的特殊特性(例如 MongoDB 上的地理空间查询,能够为 Neo4j 执行图遍历)。它们都不是(并且将会)在 JPA 中可用,因此无论如何您都需要提供专有扩展。
  • 更糟糕的是,如果假设用户像在 JPA 中定义的那样在 NoSQL 存储上工作,JPA 的一些概念只会将用户引导到错误的方向:应该如何在 MongoDB 之上合理地实现事务回滚?

因此,对于 Spring Data,我们选择为受支持的存储提供一致的编程模型,而不是试图将所有内容强制到一个过度抽象的 API 中:你得到众所周知的模板实现,你得到存储库抽象,它们的工作方式相同适用于所有商店,但允许您利用商店特定的功能和概念。

于 2014-04-19T09:38:21.947 回答
25

免责声明:我是 Hibernate OGM 开发人员之一,因此我将尝试提供其背后的一些原因。

Hibernate OGM 为 NoSQL 解决方案提供 Java 持久性 (JPA) 支持。它重用 Hibernate ORM 的引擎,但将实体持久化到 NoSQL 数据存储而不是关系数据库中。它还旨在在 JPA 不适合时提供对特定数据存储功能的访问。

这种方法很有趣有几个原因:

  • 已知的语义和 API。Java 开发人员已经熟悉 JPA,这意味着不必学习较低级别的 API。它还支持 HQL 和本机后端查询。

  • 后期后端选择。选择正确的 NoSQL 数据存储并非易事。使用 Hibernate OGM,您不必提交特定的 NoSQL 解决方案,您将能够轻松切换和测试不同的后端。

  • 现有的工具和库。JPA 和 Hibernate ORM 已经存在了一段时间,您将能够重用在底层使用它们的库和工具。

  • 大多数 JPA 逻辑模型都适合。一个很好的例子是@Embedded, @EmbeddedCollectionand @Entity(可以是基于选择的数据存储的节点、文档或缓存)。不可否认,注释名称可能很奇怪,因为您还必须处理@Tableand @Column

  • JPA 在对象级别抽象了持久性,为许多技巧和优化留出了空间。我们计划了几个想法,例如多语言持久性:将数据存储在多个数据存储中,并将最好的一个用于特定的读取作业。

主要缺点是 JPA 的一些概念不容易映射到 NoSQL 世界:例如事务。虽然您将有权访问事务划分方法,但您将无法回滚不支持本机事务的数据存储(在这种情况下,事务将用于对操作进行分组并尝试优化调用次数分贝)。

此外,如果您的数据集本质上是非以域模型为中心的,那么 Hibernate OGM 不适合您。

于 2016-11-11T12:32:47.887 回答
0

可以使用 SpringData。如果您还记得 Spring ORM 还使用了一些 JPA 事物,例如 Entity、Transaction 并提供了来自 JPA 和 Hibernate API 的事物的最佳组合 a。如果 JPA 在 NoSQL 方面变得更加成熟,Spring 社区将在未来的版本中予以关注。虽然这不是主要原因。@Oliver Drotbohm 描述了大多数原因。阅读更多 SprinData 文档并进一步分析您的数据模型、数据存储连续性/增长的可扩展性,找到最适合您的解决方案并考虑 @Davide 给出的建议。很多情况下 SpringData 与 MongoDB 集成的成功率比 JPA 更高。

于 2019-04-19T08:07:10.080 回答