澄清术语 - 当从数据库中获取实体时,“hydrating” JPA或Hibernate实体是什么意思?

94
在ORM/实体的懒加载方面,我对“Hydration”这个术语的理解如下:
“Hydrating”描述的是使用懒加载获取实体并填充之前未填充的一些或全部属性的过程。
例如:从数据库中加载类Author
@Entity
class Author
{
     @Id
     long id;
     List<Book> books;
}

最初,books 集合并没有被填充。

据我所知,从数据库加载 books 集合的过程被称为“Hydrating”。

这个定义正确吗?这个术语常用吗?还有其他更常用的术语可以用来描述此过程吗?

6个回答

157

Hydrate最初是一个术语,用于从数据库中填充一个实例化(但为空的)值对象/模型 (特别是在Hibernate中)。

其他各种ORM和工具,如BizTalk使用Hydrate和其他相关术语(例如,BizTalk使用Dehydrated一词表示实例可用但尚未填充)。

个人认为避免使用冗余术语很重要,“populated”的意思与“填充”一样,不必重新发明术语。这样做没有任何意义,反而会导致混淆(在遇到重新发明的术语时普遍的第一个想法是:“这是否有所不同和神奇?”)。

这种风格语言的BizTalk扩展,特别是“Dehydrated”是多余的。我希望人们没有忘记如何说“空”或“清除”?

“Hydrated”及其相关隐喻本质上是一种营销工具,是为了区分Hibernate与竞争产品。

此时Hibernate和其他ORM产品已经使用了这些术语多年,因此Hydrate(和Dehydrate)将会留下来。


20
当然,但它是首要的,简单明了,因此远不复杂。你可能已经意识到,即使在软件层面上,一个比特值为“真/假”或“1/0”的东西也是隐喻性的......现在我们应该开始用其他的方式来称呼“真实”吗?关于海森堡,换成“几乎肯定”怎么样? - ocodo
20
我认为“水合”比“填充”更好作为一个比喻。 "填充" 会让人想到一群殖民者迁移到一个外来或未开垦的领土然后 "填充"它。有一个空间,你用不相关的东西来填充它(但假定那些东西属于这里)。而当你给某物注水,比如干无花果,物质的本质存在其中但缺乏充实感。这正是你“水合”物体时发生的事情。远非“营销文案”,“水合”是一个很好的比喻。 - Kyle Mathews
8
@KyleMathews,距我发布我的回答已经三年了,当时我没有明确说明“Populated”是相同活动的现有术语。 现在,“Hydrated”仍然是一个边缘术语,并且只在某些语言/产品文化中使用,而“Populated”则作为通用且更广泛使用的术语。 如果您喜欢,请继续使用“Hydrate”,但个人认为这样做过于炫耀和影响力。 - ocodo
27
如果你在不懂“hydrate”的人面前使用这个词,你就需要解释它的意思。为什么不直接使用一个在你听众中已经容易理解的单词呢,即使它不是最准确的词汇? - Samantha Branham
14
没有人不查阅资料就知道“hydrate”代表什么意思,这表明它是一个愚蠢的流行语,不幸地被许多ORM框架所采用。 - BadHorsie
显示剩余6条评论

21

实体加载状态

当您获取实体时,Hibernate会尝试从二级缓存或数据库中加载它。

Entity loaded state

如果实体没有存储在二级缓存中,则会执行查询,并将JDBC ResultSet转换为包含加载时实体属性值的Object[]。
当缓存实体时,二级缓存会存储这个Object[]。因此,无论是从数据库还是二级缓存中加载实体,都会得到Object[]实体属性值数组。
将Object[]加载状态转换为Java实体对象的过程称为hydration,其过程如下:
final Object[] values = persister.hydrate(
    rs, id, object,
    rootPersister, cols, eagerPropertyFetch, session
);

已加载的状态以EntityEntry对象的形式保存在当前运行的持久化上下文中,稍后将用于默认脏检查机制,该机制将当前实体数据与加载时的快照进行比较。

已加载的状态也用作第二级实体缓存的缓存条目值。

将实体转换为Object[]的逆操作,用于绑定INSERTUPDATEDELETE语句的SQL参数值,称为dehydration


4
“水化"是一个广泛的术语。在我们公司中,我们使用“再水化”这个术语来加载整个对象图的所有对象属性。这篇帖子讨论了各种水化级别(尽管他们是在Hibernate的上下文中使用的)。

该链接已失效。 - James Martinez

2
在ORM的上下文中,“hydrate(s)”一词指的是框架为您提供对象。因此,在从存储中获取数据后,ORM会“使对象变得更加丰满”。该术语可适用于任何ORM框架在存储中表示对象/图形的情况。请注意保留HTML标签。

0

在Hibernate库的内部,术语“hydration”被广泛用于指代设置最近加载对象的字段的过程,并且确实与对象图形填充相关。
但它与延迟加载的概念不同,即给用户一个半填充的对象,让其余部分按需加载。
hydration始终是惰性或急切地执行的,这是Hibernate的东西。
延迟加载只是为了方便。

将Hibernate替换为您选择的ORM名称


-1

Hydration 是一个通用的 ORM 领域术语,意味着一种返回查询结果的方法。它不是一个过程、动词、行为或事件,而是一个名词。因此,进行 hydration 简单地意味着 使用 hydration 方法。Hydration 方法创建表示数据的结构。然而,有一个普遍的误解,即每个 hydration 不仅实例化对象,而且在返回其引用之前还填充它。这不是一个规则。虽然特定的 hydration 也可以填充一个对象,但并不是所有的 hydrations 都会这样做。不同的 hydrations 返回不同的结构:

  • 单一标量
  • 标量数组
  • 数组的数组
  • 对象数组
  • 收集标量的对象
  • 收集数组的对象
  • 收集其他对象的对象
  • ...更多

这是ORM实现的细节。一些ORM提供多个hydration,您可以通过向查询构建器传递参数来选择其中一个,而有些则不会给您这种控制,并通过约定替换它,试图聪明地处理它(这就是上面提到的hydration/population误解的来源)。更高级的ORM允许您编写自己的hydrator,用于映射字段类型的自定义对象。该术语本身与反序列化密切相关(这更通用,不一定涉及数据库或ORM)。


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