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


76

在ORM /实体的延迟加载的情况下,我对术语“水合”的理解如下:

“水合”描述了填充使用延迟加载获取的实体的某些或全部先前未填充的属性的过程。

例如:Author从数据库中加载类:

@Entity
class Author
{
     @Id
     long id;
     List<Book> books;
}

最初,books不填充集合。

据我了解,books从数据库加载集合的过程称为“水化”集合。

这个定义正确吗?我应该在此过程中使用另一个更通用的术语吗?


3
对于投票结束该问题的人:我添加了一个示例来帮助阐明我的要求。如果尚不清楚,请发表评论,让我知道我可以澄清的内容。
马蒂·皮特

Answers:


130

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

其他各种ORM和工具(例如BizTalk)都使用Hydrate和其他相关术语(例如,BizTalk使用术语“脱水”表示实例可用但尚未填充)。

就我个人而言,我不赞成重复进行术语大修,在没有重新发明语言的情况下,填充意味着同一件事。它什么也没有添加,并导致混乱(遇到重新发明的术语时通常会首先想到:这在某种程度上是不同的和神奇的吗?)。

这种语言,特别是脱水的BizTalk扩展是多余的。我希望人们不会忘记说什么,是还是清晰

Hydrated及其相关的隐喻本质上是营销工具,其发明旨在将Hibernate与竞争产品区分开。

在这一点上,Hibernate和其他ORM产品已经使用了这些术语多年,因此水合物(和脱水)仍然存在。


18
当然,它是第一位的,它很简单,因此令人费解。在这一点上,您可能还已经意识到,软件层上的几乎所有内容,甚至是“ true / false”或“ 1/0”的值都是隐喻的……我们现在是否应该开始将“ true”称为其他东西?关于海森堡,“几乎可以肯定”如何?
ocodo 2011年

16
我认为“水合物”是比“人口”好得多的隐喻。人口聚集使我想到了一群移居外国或处女地并“居住”在其中的殖民者。有一个空白空间,您在其中填充了无关的内容(但大概属于该空间)。给某物补水时,比如说干无花果,该物质的本质在那里,但缺乏饱满感。这就是当您“水合”对象时发生的事情。水合物远非“营销骗子”,而是一个很好的隐喻。
凯尔·马修斯

4
@KyleMathews好吧,距离我发布答案已经三年了,我没有明确指出“ Populated”是同一活动的既有术语,在这一点上,“ Hydrated”仍然是一个边际术语,并且仅在某些语言/产品文化中使用,而“ Populated”仍然是通用且使用更广泛的术语。一定要继续使用“ Hydrate”(水合物),如果它令您满意,我个人认为它自命不凡且受到影响。
ocodo 2014年

18
如果在不懂该词的人周围使用“水合物”,则必须对其进行解释。为什么不使用即使已经不是最精确的单词的听众已经可以理解的单词呢?
萨曼莎·布兰纳姆

5
没有人知道它不知道水合物的含义这一事实表明,它是一个愚蠢的流行词,不幸的是,现在它已根植于许多ORM框架中。
BadHorsie

11

由于这是一个非常常见的问题,因此此答案基于我在博客上写的一篇文章

实体加载状态

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

实体加载状态

如果该实体未存储在二级缓存中,则将执行查询并将JDBCResultSet转换为Object[]包含加载时实体属性值的。

二级缓存存储此Object[]缓存的实体时。因此,从数据库或二级缓存加载实体时,您将获得Object[]实体属性值数组。

Object[]加载的状态转换为Java实体对象的过程称为hydration,它看起来如下:

final Object[] values = persister.hydrate(
    rs, id, object,
    rootPersister, cols, eagerPropertyFetch, session
);

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

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

改造实体到的反向操作Object[]绑定SQL参数值时所使用INSERTUPDATEDELETE语句被称为脱水


4

水化是一个宽松的名词。在我们公司中,我们使用“补水”来加载整个对象图的所有对象属性。这是一篇讨论各种水合程度的文章(同样,这是一种通用用法,尽管它们在休眠状态下使用)。


2

我认为,在ORM中,术语“水合物”仅表示框架为您提供了对象。因此,从存储中提取数据后,ORM将对象“水化”。该术语可以在ORM框架为您提供商店中表示的对象/图形时随时使用。


0

术语“水合作用”在休眠库的内部广泛使用,是指设置最近加载的对象的字段的过程,实际上与对象图种群有关。
但这与延迟加载的概念不同,即向用户提供一半填充的对象,然后让其余对象按需加载。
总是懒惰或急切地进行补水,这是冬眠的东西。
延迟加载只是为了方便

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


0

水化是一个通用的ORM域术语,表示一种返回查询结果的方法。它不是一个过程,不是动词,不是发生的动作或事件,而是名词。因此,水合只能意味着使用水合,即使用该特定方法,没有别的东西,并且本身没有带来任何东西,因此永远不应使用。特定的水化可以实例化对象并在返回其引用之前填充它,但是水化通常并不意味着要填充。不同的水合作用返回不同的结构:

  • 奇异标量
  • 标量数组
  • 数组数组
  • 对象数组
  • 对象收集标量
  • 对象收集数组
  • 对象收集其他对象
  • ...更多

这是一个ORM实施细节。一些ORM提供了多种混合方式,您可以通过将一个参数传递给查询生成器来选择一种混合方式,而某些ORM则不给您这种控制权,而是用惯例取代它,以求精明它通常会导致错误的假设。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.