这是一个非常激动人心的时刻,Hibernate OGM 项目的第一个公开 alpha 版本。Hibernate OGM 代表对象网格映射,其目标是提供一个完整的 JPA 引擎,用于将数据存储到 NoSQL 存储中。这是一篇相当长的博客文章,所以我将其分为从目标到技术细节再到未来的几个部分。
请注意,我说它是第一个公开 alpha 版本,因为 JBoss World 2011 的主题演讲由 Hibernate OGM Alpha 1 支持。是的,它是 100% 实时且无任何虚假,没有崩溃 :) Sanne 详述了 如何在演示中使用 Hibernate OGM。这篇博客文章是关于 Hibernate OGM 本身及其工作原理的。
为什么是 Hibernate OGM
Infinispan 团队的一个目标是提供更高级的对象操作 API。由于一系列事件,我们尝试了 JPA 和 Hibernate Core 引擎,看看这能否满足需求:看起来是可以的。但是,这个愿景很快得到了扩展,现在 Hibernate OGM 成为一个独立的项目,旨在为其他 NoSQL 存储提供 JPA。
在JBoss,我们坚信,一旦提供了工具,开发人员、应用程序以及整个企业将利用新的数据使用模式从中创造价值。我们希望加速这一采纳/实验过程,并让更多人受益。NoSQL就像是青少年之间的性:每个人都谈论它,但真正尝试的人却寥寥无几。这并不奇怪,因为NoSQL解决方案本身就很复杂,极其多样,并且具有截然不同的优势和劣势:尝试使用它意味着巨大的投资(无论是时间还是金钱)。(JBoss的一个目标)就是帮助降低进入门槛,Hibernate OGM正是与此理念相符合。
我们希望通过提供熟悉的一个模型来简化各种NoSQL方法的程序模型:那就是JPA。熟悉且通用的程序模型的好处在于,它易于尝试一个数据后端,并在将来迁移到另一个数据后端,而不会对应用程序设计产生重大影响。
那么,何时应该使用Hibernate OGM呢?我们并不声称(那样做是愚蠢的)所有NoSQL的使用场景都可以通过JPA和Hibernate OGM来解决。然而,如果你构建一个以领域模型为中心的应用程序,这将是一个有用的工具。我们还将扩展Hibernate OGM的功能和用例,以覆盖不同的领域(例如,使用NoSQL存储作为RDBMS的前端)。此外,Hibernate OGM不是一个全有或全无的工具。你可以非常合理地使用它来处理一些数据存储交互,并在需要更高级功能或自定义查询机制时回退到你的数据存储原生API。这里没有锁定。
它是如何工作的
基本上,我们正在重用非常成熟的Hibernate Core引擎,并巧妙地将其数据存储到网格中。我们通过两个主要合同连接到Hibernate Core,这两个合同分别是加载器和持久器。正如你所预期的,这些加载和持久化/更新/删除实体和集合。
在项目早期,我们就决定尽可能保留关系模型的好处
- 以元组的形式存储实体
- 保持主键和外键的概念(尽管尚未强制执行外键违规)
- 在应用程序数据模型和数据存储数据模型之间保持一个(可选的)间接层
- 限制 ourselves to core data types to maximize portability
实体被存储为元组,本质上是一个Map<String,Object>其中键是列名,值是列值。在大多数情况下,属性映射到列,但这可以被解耦(@Column)。实体元组可以通过单个键查找访问。关联更加复杂,因为与RDBMs不同,许多NoSQL存储和网格特别没有内置的查询引擎,因此不能轻松地查询关联数据。Hibernate OGM通过存储导航信息来从给定的实体导航到其关联信息,这是通过单个键查找实现的。这里的缺点是写入需要多个键查找/更新操作。
以下是一个表示对象模型、关系模型以及数据最终如何存储在数据网格中的方案的图。

这意味着我们不是在网格中存储实体对象,而是在实体脱水版本中。这是一个好事。盲目地序列化实体会导致许多问题,包括
- 当实体指向其他实体时,你是否在存储整个图?
- 你如何保证对象身份或甚至复制对象的一致性?
- 如果发生类模式更改怎么办?
- 你如何查询你的数据?
- 如何将类定义复制到其他节点?
除非您存储相对简单且短暂的数据,否则请勿进行盲目的序列化。Hibernate OGM会为您智能地执行脱水操作。
有关我们如何进行操作的更多信息,请参阅Hibernate OGM参考文档中的架构部分。
今天支持什么,明天又如何呢?
今天Hibernate OGM在所有CRUD(创建、读取、更新、删除)方面都非常稳定,当然,由于我们简单重用了Hibernate Core的引擎,所以对于所有JPA对象生命周期规则也非常稳定。以下是支持的要点摘录,但请查阅完整的参考文档,了解不支持的内容。
- 实体的CRUD操作
- 具有简单(JDK)类型的属性
- 内嵌对象
- 实体层次结构
- 标识符生成器(目前支持TABLE和所有基于内存的生成器)
- 乐观锁定
- @ManyToOne, @OneToOne, @OneToMany和@ManyToMany关联
- 双向关联
- 集合, 列表和映射对集合的支持
- 大多数Hibernate原生API(如会话)和JPA API(如实体管理器)
- 与JPA或Hibernate Core中相同的启动模型:在JPA中,将<provider>设置为org.hibernate.ogm.jpa.HibernateOgmPersistence然后您就可以开始了
由于Hibernate OGM是一个JPA实现,您可以像使用Hibernate Core一样进行配置和使用,并使用JPA注解映射您的实体。同样的事情,没有什么新东西。请参阅我们参考文档中的入门部分。
我们今天不支持的是JP-QL。对简单查询的支持即将推出,并将基于Hibernate Search的索引和查询功能。然而,您现在就可以直接使用Hibernate Search与Hibernate OGM一起使用。您甚至可以将索引存储在Infinispan、Voldemort或Cassandra(和其他)中。
此外,最初支持的非SQL解决方案是Infinispan。背后的原因非常简单
- 我们必须从其中一个开始
- 键/值是一个简单的模型
- 如果我们发现错误或需要功能,我们可以踢一些JBoss员工的屁股
- 我们对Infinispan的隔离和事务模型有很好的内部知识,而且它恰好非常接近关系模型
话虽如此,我们确实打算很快支持其他NoSQL引擎,特别是其他键/值引擎。我们已经有了一些抽象,所以它们需要抛光。如果您知道一个NoSQL解决方案并想为Hibernate OGM编写方言,请与我们联系并做出贡献。
未来
我们处于项目的初期阶段,未来正在被塑造。以下是我们计划中的几个要点
- 支持其他键/值对系统
- 支持其他NoSQL引擎
- 声明性反规范化:我们至今一直关注功能,性能检查和关联反规范化计划中
- 支持复杂的JP-QL查询,包括多对多连接和聚合
- 支持现有的JPA应用程序
这是一个社区驱动的努力,如果您对以下任何一个领域感兴趣或您有其他想法,请告诉我们!
如何下载和做出贡献!
您可以从JBoss.org的Maven仓库下载jar文件,或者当然,下载发行版(我建议您下载发行版,因为它包含与您希望使用的版本一致的文档)。
说到文档,我们最初试图发布一个相当高级的参考文档。特别是入门和架构部分相当完整:查看它。
最后但同样重要的是,Hibernate OGM还处于起步阶段,如果您有兴趣贡献或有关于如何做事的想法,告诉我们并发表意见!
非常感谢团队,外部贡献者以及Cloud-TM项目成员的支持和测试。
Emmanuel和团队。