“Hydrating”描述的是使用懒加载获取实体并填充之前未填充的一些或全部属性的过程。
例如:从数据库中加载类
Author
。@Entity
class Author
{
@Id
long id;
List<Book> books;
}
最初,books
集合并没有被填充。
据我所知,从数据库加载 books
集合的过程被称为“Hydrating”。
这个定义正确吗?这个术语常用吗?还有其他更常用的术语可以用来描述此过程吗?
Author
。@Entity
class Author
{
@Id
long id;
List<Book> books;
}
最初,books
集合并没有被填充。
据我所知,从数据库加载 books
集合的过程被称为“Hydrating”。
这个定义正确吗?这个术语常用吗?还有其他更常用的术语可以用来描述此过程吗?
Hydrate最初是一个术语,用于从数据库中填充一个实例化(但为空的)值对象/模型 (特别是在Hibernate中)。
其他各种ORM和工具,如BizTalk使用Hydrate和其他相关术语(例如,BizTalk使用Dehydrated一词表示实例可用但尚未填充)。
个人认为避免使用冗余术语很重要,“populated”的意思与“填充”一样,不必重新发明术语。这样做没有任何意义,反而会导致混淆(在遇到重新发明的术语时普遍的第一个想法是:“这是否有所不同和神奇?”)。
这种风格语言的BizTalk扩展,特别是“Dehydrated”是多余的。我希望人们没有忘记如何说“空”或“清除”?
“Hydrated”及其相关隐喻本质上是一种营销工具,是为了区分Hibernate与竞争产品。
此时Hibernate和其他ORM产品已经使用了这些术语多年,因此Hydrate(和Dehydrate)将会留下来。
当您获取实体时,Hibernate会尝试从二级缓存或数据库中加载它。
如果实体没有存储在二级缓存中,则会执行查询,并将JDBC ResultSet转换为包含加载时实体属性值的Object[]。final Object[] values = persister.hydrate(
rs, id, object,
rootPersister, cols, eagerPropertyFetch, session
);
已加载的状态以EntityEntry对象的形式保存在当前运行的持久化上下文中,稍后将用于默认脏检查机制,该机制将当前实体数据与加载时的快照进行比较。
已加载的状态也用作第二级实体缓存的缓存条目值。
将实体转换为Object[]
的逆操作,用于绑定INSERT
、UPDATE
或DELETE
语句的SQL参数值,称为dehydration。
在Hibernate库的内部,术语“hydration”被广泛用于指代设置最近加载对象的字段的过程,并且确实与对象图形填充相关。
但它与延迟加载的概念不同,即给用户一个半填充的对象,让其余部分按需加载。
hydration始终是惰性或急切地执行的,这是Hibernate的东西。
延迟加载只是为了方便。
将Hibernate替换为您选择的ORM名称
Hydration 是一个通用的 ORM 领域术语,意味着一种返回查询结果的方法。它不是一个过程、动词、行为或事件,而是一个名词。因此,进行 hydration 简单地意味着 使用 hydration 方法。Hydration 方法创建表示数据的结构。然而,有一个普遍的误解,即每个 hydration 不仅实例化对象,而且在返回其引用之前还填充它。这不是一个规则。虽然特定的 hydration 也可以填充一个对象,但并不是所有的 hydrations 都会这样做。不同的 hydrations 返回不同的结构:
这是ORM实现的细节。一些ORM提供多个hydration,您可以通过向查询构建器传递参数来选择其中一个,而有些则不会给您这种控制,并通过约定替换它,试图聪明地处理它(这就是上面提到的hydration/population误解的来源)。更高级的ORM允许您编写自己的hydrator,用于映射字段类型的自定义对象。该术语本身与反序列化密切相关(这更通用,不一定涉及数据库或ORM)。