【问题标题】:Support JPA and MongoDB in the same application在同一应用程序中支持 JPA 和 MongoDB
【发布时间】:2012-08-11 06:46:13
【问题描述】:

存在一个听起来很简单的要求:支持几个 RDBMS(我打算使用 JPA 来实现)和 MongoDB(首选 spring-data-mongodb)来实现持久性。更准确地说,必须配置和使用一个或另一个,我不是在谈论跨商店。

程序应如下:编写应用程序,将 .war 交付给客户,客户在配置文件中放置数据库 URL 等持久性信息(即 mongodb:localhost/test 或 jdbc:oracle:thin: 1521@foo)。 此外,最好扩展其他数据存储(如 couchdb)的实现。

是否有最佳实践或至少有任何不那么肮脏的非太多开销的解决方案?

【问题讨论】:

  • 我不清楚这里的实际问题是什么。
  • 嗯,很抱歉不清楚。所以,问题是:如何在应用程序中支持多个数据存储(rdbms 和 nosql),同时限制实际数据访问实现由用户配置选择。

标签: java mongodb jpa dao


【解决方案1】:

Eclipselink 是一个选项吗?最新版本支持 RDBMS 和 NOSQL(包括 Mongo)的 JPA

https://blogs.oracle.com/theaquarium/entry/jpa_and_nosql_using_eclipselink

【讨论】:

  • 可能还有 SpringData,但你必须重做一些事情
  • eclipselink 似乎是一种选择。我不知道那里的 NoSQL 支持。
  • @janinee NoSql 有一些注释,但 mongodb 没有用于 JNDI 的 jdbc 驱动程序邻居数据源实现,也没有 JTA 支持,一旦您无法正确配置 persistence.xml,JPA 对 Java EE 应用程序就无用了。这样您就不能使用@PersistenceContext 注入,也不能使用实体管理器。您可以使用 RESOURCE_LOCAL 对其进行配置,但不能将其部署到 Java EE6 容器。
【解决方案2】:

我目前正在开发一个具有类似需求的项目。我可以根据我的经验给你建议。

我认为这里的主要关注点不是技术,而是如何构建数据。为此,我建议您使用 AbstractFactory 和 FactoryMethod 设计模式。关于技术,我在 MongoDB 中使用 Morphia,在 MySQL 中使用 JPA(作为示例),它的工作原理非常棒。

所以最简单的方法是为所有要持久化的对象创建接口,然后使用 Morphia 标记和 JPA 标记为 MongoDB 执行一个实现。为 MongoDB 创建一个工厂,它将处理 MongoDB 对象中的所有 CRUD 操作,并对 JPA 工厂执行相同的操作。

应用启动时,只需要验证用户选择的持久化,然后初始化对应的工厂即可。

【讨论】:

    【解决方案3】:

    DataNucleus JPA 允许您持久保存到 RDBMS、MongoDB 和许多其他数据存储(LDAP、HBase、AppEngine、Neo4j 等),只需更改连接 URL,并且已经这样做了一段时间

    【讨论】:

    • 我在发布问题之前尝试了 datanucleus。元数据检查是一种缺点。没有相应字段 foo 的 getFoo 会导致错误。由于那些“不真实”的吸气剂经常存在,所以我不喜欢使用 datanucleus。
    • 使用 JPA,您可以轻松地在没有字段的情况下进行属性访问(setters/getters),而且 DataNucleus JPA 确实支持这一点(因为它通过了 JPA TCK,它具有类似的测试)。如果您遇到无法正常工作的案例,您可以轻松地进行演示。
    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2016-05-25
    相关资源
    最近更新 更多