是否存在隐藏供应商特定逻辑的数据存储查询的通用模式?

时间:2012-01-06 21:19:44

标签: java database generics jpa design-patterns

我正在尝试找到一种在Java中实现通用搜索API的好方法,这将允许我的用户搜索后端存储库而无需知道后端技术是什么,因此如果将来我们切换供应商我可以重新实现底层逻辑,而无需重新编码API。下面的存储库可以是关系数据库或文档存储,如SOLR,CouchDB,MongoDB等......它需要支持所有典型的搜索要求,如通配符,范围,按位运算符等。

是否有任何标准方法可以解决此问题?

JPA是我最好的选择吗?它会做我需要的一切,包括非关系型数据库吗?

提前致谢!

5 个答案:

答案 0 :(得分:1)

你需要的是像Hibernate这样的ORM框架,如果你选择JPA,你需要重新发明很多轮子。

使用Hibernate,您可以编写用于搜索后端数据库或存储库的业务逻辑,而无需特定于供应商的实现,如果以后需要更改后端,则可以在不影响现有业务代码实现的情况下执行此操作。

我建议您查看hibernate documentation以获取进一步的参考资料

答案 1 :(得分:1)

Spring Data项目保护伞提供了一个名为CrudRepository的漂亮的DAO抽象。我相信大多数子项目(JPAMongoDB等)提供了一些实现。

答案 2 :(得分:1)

JPA将是您用于将关系数据库映射到对象的众多实现之一。它不会保护您免受数据库更改的影响。

我认为你正在寻找DAO Pattern。我正在做的事情如下:

  1. 为每个DAO创建一个界面
  2. 创建一个更高级别的DAO实现,只需调用我实际的数据库特定实现
  3. 使用Spring将更高级别的DAO实现连接到数据库特定的实现。
  4. 这样,任何地方的代码都无法触及数据库特定的实现。连接仅以XML形式形成。

答案 3 :(得分:1)

JPA仅围绕RDBMS设计。将它用于其他类型的数据存储是没有意义的,因为事情喜欢它的查询语言泄漏SQL语法。 JDO专为数据存储区的敏捷性而设计,并使用DataNucleus等实现为许多数据存储区提供持久性,但并非所有这些都提到过。

答案 4 :(得分:0)

JPA是围绕RDBMS设计的,Hibernate也是为RDBMS设计的。很少有JPA的实现支持no-sql。类似的项目是围绕hibernate构建的,以支持无sql数据库。然而,API本身已针对RDBMS进行了调整。

实现DAO模式需要您编写自己的查询API。稍后在数据存储发生变化时扩展实现。

JDO和DataNucleus是为异构数据存储而设计的。已经有十几家商店和RDBMS的支持。美是查询api在商店中保持不变。 JDO允许您使用域模型并将存储详细信息留给DataNucleus等实现。

因此我建议JDO api使用datanucleus。 以下链接提供了DataNucleus中已有的列表数据存储和f功能 http://www.datanucleus.org/products/accessplatform_3_0/datastore_features.html