在ORM / Lazy加载实体的上下文中,我对术语“水合”的理解如下:
“Hydrating”描述了填充使用延迟加载获取的实体的一些或所有先前未填充的属性的过程。
例如:从数据库加载类Author
:
@Entity
class Author
{
@Id
long id;
List<Book> books;
}
最初,没有填充books
集合。
据我所知,从数据库加载books
集合的过程称为“保湿”集合。
这个定义是否正确,并且是常见的术语?我应该在这个过程中使用另一个更常见的术语吗?
水合物开始作为从db填充实例化(但是空的)值对象/模型的术语(特别是在Hibernate中)。
各种其他ORM和工具(如BizTalk)使用Hydrate和其他相关术语(例如,BizTalk使用术语Dehydrated表示实例可用但尚未填充。)
就个人而言,我不喜欢冗余的术语检修,填充意味着同样的事情,没有重新发明语言。它没有增加任何东西并导致混乱(在遇到重新发明的术语时常见的第一个想法:这在某种程度上是不同的和神奇的吗?)。
这种语言风格的BizTalk扩展,特别是Dehydrated是多余的。我希望人们没有忘记怎么说,空洞或清楚?
水合及其相关隐喻本质上是营销工具,旨在将Hibernate与竞争产品区分开来。
此时,Hibernate和其他ORM产品已使用这些术语多年,因此Hydrate(和Dehydrate)仍然存在。
在Hibernate命名法中,hydration is when a JDBC ResultSet is transformed to an array of raw values:
final Object[] values = persister.hydrate(
rs, id, object,
rootPersister, cols, eagerPropertyFetch, session
);
水合状态作为EntityEntry对象保存在当前运行的持久性上下文中,该对象封装了加载时实体快照。然后使用水合状态:
反向操作称为dehydration,它将实体状态复制到SQL INSERT或UPDATE语句中。
保湿是一个松散的术语。在我们公司,我们使用“rehydration”作为术语来加载整个对象图的所有对象属性。 Here is a post谈论各种水合作用(同样这是一般用法虽然他们在休眠的背景下使用)。
我认为ORM上下文中的“水合物”一词仅仅意味着框架为您提供了对象。因此,在从商店中取出数据后,ORM将对象“水化”。每当ORM框架为您提供在商店中表示的对象/图形时,该术语都可以应用。
术语水合作用广泛用于hibernate库的内容中,以指代设置最近加载的对象的字段的过程,并且确实与对象图populaton有关。 但它与延迟加载的概念不同,即为用户提供一个半满的对象,并让其余的按需加载。 水合作用总是在懒洋洋地或急切地进行,而且它是休眠的东西。 延迟加载只是为了方便
将hibernate替换为您选择的orm的名称
水合作用是一般的ORM域术语,表示返回查询结果的方法。它不是一个过程,不是一个动词,不是一个只出现名词的动作或事件。因此,保湿只能意味着使用水合作用,即使用该特定方法,没有其他任何东西并且本身不带任何东西,因此不应该使用。特定的水合作用可以实例化一个物体并在返回其参考物之前填充它,但一般的保湿并不意味着填充物。不同的水合作用返回不同的结构
这是一个ORM实现细节。一些ORM提供了多个水合作用,你可以通过将一个参数传递给查询构建器来选择一个,有些不会给你那个控制,并按惯例替换它,试图对它进行智能处理,这通常会导致错误的假设。