【问题标题】:Does MongoDB work with JPA?MongoDB 可以与 JPA 一起使用吗?
【发布时间】:2015-08-10 21:36:12
【问题描述】:

我是使用数据库的新手,所以我的问题可能很幼稚。我目前有一个使用 Spring Data 和 JPA 的项目。我在后台使用 Hibernate 和 MySQL。是否可以切换到 MongoDB?当我用谷歌搜索“jpa MongoDB”时,顶部链接显示了一些有趣的东西(DataNucleus JPA and MongoDB)。此链接:MongoDB docs 似乎表明 Java 驱动程序是 JPA 兼容的,那么换出数据库实现是否应该很简单?

【问题讨论】:

    标签: spring mongodb jpa spring-data database


    【解决方案1】:

    这在很大程度上取决于您对“工作”的定义。 “一般工作”? - 是的。 “合理工作” - 取决于。 “无缝工作” - 不是那么多。

    JPA 本质上是一种关系 API,因此请做好遇到这些方面的准备:

    1. JPA 不支持 MongoDB 公开的许多功能。地理空间功能、upsert 等。您将需要自定义扩展,以最大限度地减少使用 JPA 的好处。
    2. JPA 中可用的许多内容在 MongoDB(非关系世界)中没有任何意义,并且不受支持。交易? MongoDB 中的连接列应该是什么?前者不可用实际上是相当危险的。如果 JPA 开发人员调用 transaction.rollback() 会发生什么?严格来说,您不能 100% (根据定义)实现 JPA,并且大多数自称为 NoSQL 的 JPA 实现基本上都提供了 JPA 的一小部分:一些用于映射的注释,一些 EntityManager API。
    3. 仅仅在对象模型后面切换存储也是一种谬误。尤其是 NoSQL 存储的构建方式有利于某些数据结构(MongoDB 适合文档,Neo4j 适合高度互连的数据)。这意味着您将根据实际使用的存储对域代码和转换器进行不同的建模。任意切换商店会导致您将域模型减少到最小公分母,并基本上减少使用可能让您首先选择商店的功能。

    虽然我可以看到将熟悉的 API 置于新事物之上以获得某种知识转移的动机,但最终认为如果目标空间不支持关键方面(例如交易),这是一个谬误。到目前为止,我看到的所有方法最终都花费了大量的文档来记录 JPA 和存储方面都不支持的内容。

    也就是说,还有其他方法从“一个 API 来统治所有这些”转变为主动利用 NoSQL 领域的多样性(想想看:一组由它们不是定义的技术em> 根据定义会非常多样化)。

    Spring Data project(免责声明:我是这方面的领导者)正在提升一个抽象级别,而是提供一个一致的存储库编程模型,而不是一个统一的 API。这仍然允许为商店特定功能提供支持,但一般使用方式保持不变。

    所以我建议在这里转移到专门的 Spring Data MongoDB 项目。

    【讨论】:

      【解决方案2】:

      您应该能够通过一些工作将它们换掉。这是来自 Spring.io 网站的示例指南:Accessing Data with MongoDB

      您将使用 Mongo 存储库,而不是使用 JPA 存储库...该示例应该足以让您有所了解。

      【讨论】:

        【解决方案3】:

        EclipseLink 扩展 JPA 以支持 MongoDB:https://wiki.eclipse.org/EclipseLink/Examples/JPA/NoSQL

        【讨论】:

          【解决方案4】:

          是的,DataNucleus JPA 允许它以及许多其他数据库。您可以通过将 JPA API 用于其他类型的数据存储来做出妥协,但这样可以很容易地对其进行调查。

          【讨论】:

            猜你喜欢
            • 2016-09-29
            • 1970-01-01
            • 2021-11-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多