写点什么

面向 NoSQL 数据存储的 Hibernate 对象映射

  • 2011-07-28
  • 本文字数:2724 字

    阅读完需:约 9 分钟

近日,Hibernate Validator、Hibernate Search 等项目的开发者 Emmanuel Bernard宣布了Hibernate OGM 。这个新框架的目标旨在通过 JPA NoSQL 数据存储提供一个公共的接口。OGM 是 Object Grid Mapping 的缩写。

InfoQ 有幸采访到了 Emmanuel Bernard 以深入了解 Hibernate OGM 以及它将要支持的 NoSQL 后端存储。Emmanuel 说他们将从 Infinispan 开始,因为团队之间能够更轻松地进行合作,但也将支持其他产品。Infinispan 与 Hibernate OGM 都是 JBoss 创建的。Infinispan 之所以成为第一选择是因为它的事务模型非常类似于关系数据库,可以很容易桥接 JPA。

目前的 Hibernate OGM 尚处在萌芽期,但我们计划支持其他的 NoSQL 实现。比如说, EhCache 团队打算成为 Hibernate OGM 提供者,并且正在与 Hibernate OGM 团队协作以在必要的情况下为 Hibernate OGM 提供增强与抽象。Emmanuel 提到很多人有兴趣为 MongoDB CouchDB Redis 提供实现。他希望对这些产品的支持能够尽快出现,此外他还希望其他项目与个人能够加入进来以支持键 / 值存储、面向文档的数据库、面向列的数据库以及面向图的数据库。

你可以通过 Infinispan, Cassandra Voldemort Apache Lucene 索引存储到数据源中,与之类似,Hibernate OGM JP-QL 引擎实现依赖于 Lucene 与 Hibernate Search ,因此 Hibernate OGM 一开始采用这些产品也是自然而然的事情了。不提供这种支持的 NoSQL 数据存储需要通过不同的策略来实现查询。

InfoQ:对于熟悉 JPA 与 MySQL 的开发者来说,上手 Hibernate OGM 与 Infinispan 困难么?其学习曲线如何呢?

非常简单!这也正是我们的目标所在。 他们的编程模型与语义完全相同。我这里所说的并不是类似于 JPA 的 API。Hibernate OGM 是个完整的 JPA 引擎。我们已经支持大多数映射及 CRUD 操作了(包括实体继承、关联等等)。如果你需要将使用 Hibernate Core 的 JPA 应用转换为 Hibernate OGM,你需要按照如下步骤进行:

  1. 将 Hibernate OGM jar 及其依赖添加到应用中
  2. 编辑 persistence.xml 并将提供者改为 Hibernate OGM,删除 JDBC 之类的属性(比如 JDBC 驱动、方言及模式生成等),并添加对 Infinispan 配置文件的引用
  3. 运行应用

这是 persistence.xml 文件修改前后的一个示例。 就这些。目前的限制因素就是 JP-QL。Alpha 2 尚不支持 JP-QL,下一版本(Alpha 3)将提供对简单 JP-QL 查询的支持。然而,如果你熟悉 Hibernate Search,那么你就可以使用全文搜索了。

该项目最酷的地方就是我们重用了大多数的 Hibernate Core 以实现对 JPA 的 CRUD 支持,这样引擎的成熟性就可以保证了。这么做可以保证不会出现与 JPA 相关的 Bug,如果出现了 Bug,那也是来自于 Hibernate Core。

InfoQ:何时应该使用 JPA/RDBMS,何时又该使用 JPA/NoSQL 呢?这两者孰优孰劣该如何评判呢?

我不会不懂装懂的。坦白地说,整个业界都想搞清楚这个问题。那我就先班门弄斧了。首先,如果关系数据库能够满足项目的需求,那么就请继续使用。NoSQL 是一套非常不同的工具,他们能够解决当前关系数据库引擎所无法解决的问题。面向图的数据库对于与图相关的查询很有帮助(告诉我住在巴黎的我朋友的朋友的朋友)。比如说,在对延迟与事务要求非常严格的情况下(同时数据量不太大)就可以使用数据网格。如果数据量是个重要的因素(比如说占据大量数据的记录),那么就可以使用 BigTable。

Emmanuel 又补充说使用 JPA 编程模型与选择使用 NoSQL 解决方案是正交的。JPA 并不适合于所有的 NoSQL 场景。使用领域模型的应用与 Hibernate OGM 搭配得会很好。JPA/NoSQL 的一个显而易见的用例就是去除关系数据库。如果 Hibernate OGM 能够让开发者尝试并探索NoSQL 解决方案,那么它就是成功的。

InfoQ:就眼前来看,Hibernate OGM 会支持哪些简单的查询呢?考虑到关系模型与大多数 NoSQL 数据存储存在不匹配的情况,那么你对 JPA 的支持能有多少呢?

我认为传统关系数据库与 NoSQL 数据存储之间的不匹配将会出现在如下两个大的领域中:

  1. 在事务与恢复模型中
  2. 在关联数据的存储方式中(随后又会被访问)

对于事务的差异来说,我认为 Hibernate OGM 不应该掩盖这种差异,而是要拥抱下面的事务模型并让用户知道它。其他的做法都是错误的,因为这会改变每一个 NoSQL 解决方案的本性。

Emmanuel 继续说到,根据底层数据存储的不同,钝化的实体与关联可能是不同的。他认为JPA 的关系模型能够很自然地适应于众多的NoSQL 存储。大家有疑问的不匹配问题并不是JPA 的问题,因为JPA 可以实现具有关联关系的两个实体拥有独立的生命周期,它可以拥有嵌入的对象,甚至是嵌入对象的集合,这非常类似于面向文档的模型。在Hibernate OGM 中,该模式是由领域模型托管的,可以脱离实际的对象结构以适应无模式的数据存储。

InfoQ:人们对 Google App Engine 的 JPA 支持的一个普遍的抱怨是与 RDBMS 上的 JPA 比起来,它有点强迫的味道,相似的地方则是它是与 NoSQL 存储打交道的 JPA。对于熟悉 JPA 与 RDBMS 的开发者来说,学习 Hibernate OGM 会很容易么?你是否听说过使用 Google App Engine 的 JPA 支持的开发者所发出的抱怨和遇到的问题?

我认为 Google App Engine 的 JPA 之痛是 BigTable 存储限制、查询引擎以及 GAE/J 团队的时间约束共同导致的结果。GAE/J 团队的开发者们非常聪明,对于他们所取得的成果来说,团队的规模其实很小,他们不可能事事都做到最好。 在 Hibernate OGM 中(到目前为止),相对于不支持的特性来说,你会看到更多的性能限制(比如说在某些情况下过多的键查找)。当然,我们最初对 JPA-QL 的支持远达不到完美,人们对此需要忍耐一阵。我们的目标是让 JPA 开发者感到自然。也就是说,我们不会与底层 NoSQL 引擎的能力和强项背道而驰。

InfoQ:Hibernate OGM 与 SQLFire 相比如何呢?

我不会谈具体的细节,因为我也不太了解这个产品,但我可以简单说两句:

  1. 它只用于 GemFire 而不是 NoSQL 中立的(甚至是数据网格)
  2. 它不开源

在处理 Hibernate OGM 与 Infinispan 时,我们也打算支持 JDBC。我们打算过一段时间再提供支持,但我发现了 JPA 以及更加抽象的层次(关联实体与嵌入式对象等等)。你可以将 Hibernate OGM 看作是反规范化的引擎,同时它又可以保持数据副本的一致性。这是个巨大的优势,可以优化你的数据访问模式。我们将提供一些声明的方式来对数据进行反规范化处理。这一点你是很难做到的,而在关系层次又是很自然的。

由于很多开发者在使用 Hibernate 和 JPA,因此向 Hibernate 框架中添加对 NoSQL 的支持也是自然而然的事情。Hibernate OGM 通过统一 NoSQL 实现的接口进一步推动了 NoSQL 的使用,但问题在于如何将对象映射、将 JPA-QL 转换为各种 NoSQL 实现。

查看英文原文: Hibernate Object Mapping for NoSQL Datastores

2011-07-28 02:504495
用户头像

发布了 88 篇内容, 共 266.8 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

日志易×DeepSeek:重新定义智能日志分析的「智」能边界

日志易

#日志易 #DeepSeek #智能日志中心

龙蜥专家走进中国农业大学 分享如何驱动生命科学高效计算

OpenAnolis小助手

操作系统 龙蜥社区 浪潮信息 龙蜥高校行

VMware Cloud Director Availability 4.7 - 灾难恢复和迁移 (DRaaS 解决方案)

sysin

vmware

Studio 3T 2025.7 发布 - MongoDB 的终极 GUI、IDE 和 客户端

sysin

mongodb

MyBatis中的 10 个宝藏技巧!

量贩潮汐·WholesaleTide

Java 数据库 mybatis

聊聊SpringAI流式输出的底层实现?

王磊

瞧瞧别人家的日期处理,那叫一个优雅!

不在线第一只蜗牛

Java

SANnav Management Portal 2.2.1 for ESXi - SAN 可视化管理软件

sysin

SANnav

Acunetix v25.4 - Web 应用程序安全测试

sysin

Acunetix

即时编译助力金仓数据库KingbaseES分析能力飞跃

金仓技术

JIT 金仓数据库

阿里云 AI 搜索开放平台新功能发布:新增GTE自部署模型

阿里云大数据AI技术

大模型 AI搜索 GTE

域名状态异常是怎么回事?怎么解决?(国科云)

国科云

当KES高可用共享集群部署遇到文件系统损坏,该如何解决?

金仓技术

KingBase 金仓数据库

k8s中资源限制 limit 和 request 的关系

陈德伟

k8s JVM Request Resource limit

金仓数据库 2025 征文大赛火热启动!丰富豪礼 + 技术曝光,等你来战!

金仓技术

征文活动 金仓数据库

防火墙事件日志及日志分析

运维有小邓

日志管理工具 IT运维服务

如何基于 Kestrel 实现 socks5 代理

八苦-瞿昙

C# Proxy

QT 实现 C++ 数据类与 json 的转换

电子尖叫食人鱼

c++ qt

MySQL的高可用解决方案

陈一之

MySQL 高可用架构

Tailwind CSS一些你需要记住的原子类

电子尖叫食人鱼

CSS 前端

阿里云 AI 搜索开放平台:RAG智能化工作流助力 AI 搜索

阿里云大数据AI技术

人工智能 阿里云 rag AI搜索 QwQ

用 AI 革新软件测试

俞凡

人工智能 软件测试

企业im有哪些? 哪款更适合你的即时通讯需求?

BeeWorks

即时通讯 IM 私有化部署 企业级应用

从一棵树到一片森林:Mint Forest V3 正式上线!

NFT Research

blockchain web3

企业内部用IM软件:安全高效的企业内部沟通工具

BeeWorks

即时通讯 IM 私有化部署 企业级应用

SpecterInsight 4 - 基于 .NET 的跨平台后渗透指挥与控制 (C2) 框架

sysin

渗透

VMware Cloud Director Availability 4.7.1 - 灾难恢复和迁移 (DRaaS 解决方案)

sysin

vmware

我定制的通义灵码 Project Rules,用 AI 写出“更懂我”的代码

阿里云云效

阿里云 云原生 通义灵码

使用华为开发者空间搭建WordPress博客平台

华为云开发者联盟

华为云 华为开发者空间

金仓数据库KingbaseES如何通过Hint影响执行计划

金仓技术

KingbaseES 金仓数据库

我定制的通义灵码 Project Rules,用 AI 写出“更懂我”的代码

阿里巴巴云原生

阿里云 云原生 通义灵码

面向NoSQL数据存储的Hibernate对象映射_Java_Rick Hightower_InfoQ精选文章