MongoDB可以与JPA一起使用吗?

19

我刚接触数据库,所以我的问题可能很幼稚。目前,我的项目使用Spring Data和JPA,底层使用的是Hibernate和MySQL。是否可以切换到MongoDB?当我谷歌搜索“jpa MongoDB”时,顶部链接显示了一些有趣的内容(DataNucleus JPA and MongoDB)。这个链接:MongoDB docs 显示Java驱动程序符合JPA标准,因此替换数据库实现应该很简单吧?

4个回答

31

这高度取决于你对“可行性”的定义。“一般而言可行”?-是的。“相当可行”-视情况而定。“无缝工作”-则不完全如此。

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

  1. JPA不支持MongoDB公开的许多功能。地理空间功能、upsert等。你需要自定义扩展来实现这一点,这将最小化使用JPA的好处。
  2. JPA中很多东西在MongoDB(非关系世界)中没有任何意义,并且不会得到支持。事务?在MongoDB中,join列应该是什么?前者的不可用实际上是相当危险的。如果JPA开发人员调用transaction.rollback()会发生什么?严格来说,你不能100%地实现JPA(根据定义),大多数自称为NoSQL的JPA实现基本上只提供了JPA的一个小子集:一些映射注释,一些EntityManager API。
  3. 简单地切换对象模型后面的存储是一种谬论。特别是NoSQL存储是按照一定的数据结构进行构建的(MongoDB适合文档,Neo4j适合高度互联的数据)。这意味着你将根据实际使用的存储不同而以不同的方式进行领域代码和转换器建模。任意切换存储将导致你将领域模型降低到最低公分母,并基本上减少了可能使你选择该存储的功能。

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

话虽如此,还有其他方法可以远离“一种API来统治它们全部”的方法,并积极利用NoSQL领域的多样性(想一想:一组由它们“不是”定义的技术本质上是相当多样化的)。

Spring Data 项目(声明:我是该项目的负责人)正在向上一层抽象移动,提供了一个一致的仓库编程模型,而不是一个统一的 API。这仍然允许支持特定存储功能,但使用通用方法保持不变。

因此,我建议在此处转移到专用的 Spring Data MongoDB 项目。


3

只需花费一些力气,您就可以轻松地将它们替换掉。以下是Spring.io网站上的示例指南:访问MongoDB数据

您将使用Mongo存储库而不是JPA存储库...这个示例应该足以给您一个想法。


2

2
是的,DataNucleus JPA可以实现这一功能,同时也适用于许多其他数据库。使用JPA API来处理其他类型的数据存储时需要做出一些妥协,但它使得研究它们变得容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接