MongoDB 与 JPA 一起工作吗?

smu*_*kes 8 database spring jpa mongodb spring-data

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

Oli*_*ohm 14

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

JPA 是一种固有的关系 API,因此请准备好遇到以下方面:

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

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

也就是说,还有其他方法可以摆脱“一个 API 来统治一切”,而是主动利用 NoSQL 空间中的多样性(想想看:一组由它们所没有定义的技术将根据定义非常多样化)。

春天数据项目(免责声明:我是这样做的铅)的动了起来抽象的层次和而提供了一个一致的信息库的编程模型,除一个统一的API。这允许仍然提供对商店特定功能的支持,但一般使用方式保持不变。

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