澄清术语:"保湿"实体:从数据库中获取属性

Mar*_*itt 66 java orm hibernate jpa lazy-loading

在ORM/Lazy加载实体的上下文中,我对术语"水合"的理解如下:

"Hydrating"描述了填充使用延迟加载获取的实体的一些或所有先前未填充的属性的过程.

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

@Entity
class Author
{
     @Id
     long id;
     List<Book> books;
}
Run Code Online (Sandbox Code Playgroud)

最初,books未填充集合.

据我所知,books从数据库加载集合的过程称为"保湿"集合.

这个定义是否正确,并且是常见的术语?我应该在这个过程中使用另一个更常见的术语吗?

oco*_*odo 117

水合物开始作为从db填充实例化(但是空的)值对象/模型的术语(特别是在Hibernate中).

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

就个人而言,我不喜欢冗余的术语检修,填充意味着同样的事情,没有重新发明语言.它没有增加任何东西并导致混乱(在遇到重新发明的术语时常见的第一个想法:这在某种程度上是不同的和神奇的吗?).

这种语言风格的BizTalk扩展,特别是Dehydrated是多余的.我希望人们没有忘记怎么说,空洞清楚

水合及其相关隐喻本质上是营销工具,旨在将Hibernate与竞争产品区分开来.

此时,Hibernate和其他ORM产品已使用这些术语多年,因此Hydrate(和Dehydrate)仍然存在.

  • 当然,它是第一次,它很简单,因此它的复杂程度要低得多.你可能在这一点上也意识到软件层上的所有东西,甚至是"真/假"或"1/0"的一点价值都是隐喻......我们现在应该开始称其为"真正的"吗?对海森堡来说"几乎肯定"怎么样? (18认同)
  • 如果你对不理解这个词的人使用"保湿",你将不得不解释它.为什么不使用一个已经被观众理解的词,即使它不是最准确的词呢? (16认同)
  • 我认为"水合物"是一个比"填充"更好的比喻.Populate让人想起一群殖民者迁移到外国或处女地区并"填充"它.有一个空的空间,你用不相关的东西填充它(但可能属于那里).在给某些东西补水的地方,比如干无花果,这种物质的精华就在那里,但却缺乏丰满感.这就是当你"保湿"一个物体时会发生什么.水合物远非"营销绒毛",是一个很好的比喻. (14认同)
  • @KyleMathews嗯,自从我发布答案三年以来,我没有明确表示"人口稠密"是同一活动的预先存在的术语,此时"水合"仍是一个边际术语,并且仅用于某些语言/产品文化,而"填充"仍然是通用和更广泛使用的术语.如果它让你高兴的话,请继续使用"Hydrate",我个人觉得它很自命不凡并受到影响. (3认同)
  • 虽然我同意“水合”一词的选择可能是有争议的(听起来确实有点太晦涩了),尤其是因为它没有立即暗示将数据从数据存储加载到内存中,但我认为这是一个独特的来自“population”的过程,通常是指用元素填充抽象数据类型,例如数组、列表、树和表,无论它是在内存中还是在持久存储中。我们用所有用户填充一个数组,用所有交易记录填充一个表。我们将一个新产品实例与其数据结合起来。 (2认同)
  • 事实上没有人知道什么水合物应该意味着没有查找它表明它是一个愚蠢的口号,不幸的是现在已经在许多ORM框架中根深蒂固. (2认同)

Vla*_*cea 8

在Hibernate命名法中,水合是指将JDBC ResultSet转换为原始值数组时:

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

水合状态作为EntityEntry对象保存在当前运行的持久性上下文中,该对象封装了加载时实体快照.然后使用水合状态:

  • 默认的脏检查机制,用于将当前实体数据与加载时快照进行比较
  • 二级缓存,其缓存条目是从加载时实体快照构建的

反向操作称为脱水,它将实体状态复制到SQL INSERT或UPDATE语句中.