Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?

Posted

技术标签:

【中文标题】Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?【英文标题】:What's the difference between Spring Data MongoDB and Hibernate OGM for MongoDB?Spring Data MongoDB 和 Hibernate OGM for MongoDB 有什么区别? 【发布时间】:2014-06-03 12:54:18 【问题描述】:

我以前没有使用过 Spring Data,但我已经多次使用 Hibernate ORM 来处理基于 mysql 的应用程序。我只是不明白为基于 MongoDB 的应用程序在两者之间选择哪个框架。

我已尝试寻找答案,但找不到在生产环境中对两者进行比较的答案。有没有人发现在 MongoDB 中使用这两个框架时遇到问题?

【问题讨论】:

【参考方案1】:

免责声明:我是 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 中:您将获得众所周知的模板实现,您将获得存储库抽象,它适用于所有商店,但让您利用商店特定的功能和概念。

【讨论】:

它是 Spring 数据 :) ... 总体上喜欢使用 Spring ... 感谢您回答我的问题。【参考方案2】:

免责声明:我是 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@EmbeddedCollection@Entity(可以是基于所选数据存储的节点、文档或缓存)就是一个很好的例子。诚然,注释名称可能很奇怪,因为您还必须处理 @Table@Column

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 和 Spring Data MongoDB:在 ResponseBody 中隐藏字段

使用Spring访问Mongodb的方法大全——Spring Data MongoDB

使用 Spring Boot WebFlux、Spring Data MongoDB Reactive 和 ReactiveMongoRepository 更新 1 个或多个特定字段 MongoDB

Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?

无法将 Spring Data MongoDB + Spring Data JPA 与 Spring Boot 一起使用

Spring Data MongoDB 三:基本文档查询(QueryBasicQuery)