MongoDB是否适用于JPA?

时间:2015-08-10 21:36:13

标签: spring mongodb jpa spring-data database

我不熟悉使用数据库,所以我的问题可能很幼稚。我目前有一个使用Spring Data with JPA的项目。我正在使用Hibernate和MySQL。是否可以切换到MongoDB?当我用Google搜索“jpa MongoDB”时,顶部链接显示了一些有趣的内容(DataNucleus JPA and MongoDB)。这个链接:MongoDB docs似乎表明Java驱动程序符合JPA,那么交换数据库实现是否应该很简单?

4 个答案:

答案 0 :(得分:4)

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

JPA是一种固有的关系API,因此请准备好迎接这些方面:

  1. JPA不支持MongoDB公开的许多功能。地理空间功能,upserts等。您将需要自定义扩展,以最大限度地减少使用JPA的好处。
  2. JPA中提供的很多东西在MongoDB(非关系世界)中没有任何意义,也不会受到支持。交易?什么是连接colum应该在MongoDB中?前者不可用实际上非常危险。如果JPA开发人员调用transaction.rollback(),应该会发生什么?严格地说,你无法实现JPA 100%(按照定义),并且大多数自称为NoSQL的JPA实现基本上都提供了JPA的一小部分:一些用于映射的注释,一些EntityManager API。
  3. 简单地将商店转换为对象模型也是一种谬论。特别是NoSQL商店的构建方式有利于某些数据结构(MongoDB适用于文档,Neo4j适用于高度互连的数据)。这意味着您将根据实际使用的商店对域代码和转换器进行不同的建模。任意切换存储将导致您将域模型减少到最小公分母,并且基本上减少了可能使您首先选择商店的功能的使用。
  4. 虽然我可以看到将熟悉的API放在新事物上以获得某种知识转移的动机,但最终认为如果目标空间不支持关键方面(例如交易),这是一个谬论。到目前为止,我所看到的所有方法最终都花费了很大一部分文档来记录JPA和商店方面都不支持的内容。

    也就是说,还有其他方法摆脱“一个API来统治它们”并主动利用NoSQL空间的多样性(想一想:一组技术由它们定义的不是会非常多样化。

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

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

答案 1 :(得分:1)

你应该可以用一点点工作来换掉它们。以下是Spring.io网站的示例指南:Accessing Data with MongoDB

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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