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

时间:2011-02-08 03:19:10

标签: java hibernate jpa orm lazy-loading

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

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

例如:从数据库加载类Author

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

最初,未填充books集合。

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

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

6 个答案:

答案 0 :(得分:111)

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

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

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

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

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

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

答案 1 :(得分:7)

在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语句中。

答案 2 :(得分:4)

水化是一个松散的术语。在我们公司,我们使用“rehydration”作为术语来加载整个对象图的所有对象属性。 Here is a post讨论了不同程度的水合作用(虽然它们在休眠状态下使用,但这是一般用法)。

答案 3 :(得分:2)

我认为ORM上下文中的'hydrate(s)'一词仅仅意味着框架为您提供了对象。因此,在从商店中取出数据后,ORM将对象“水化”。每当ORM框架为您提供在商店中表示的对象/图形时,该术语都可以应用。

答案 4 :(得分:0)

术语水合作用广泛用于hibernate库的内容中,指的是设置最近加载的对象的字段的过程,并且确实与对象图形相关。 但它与延迟加载的概念不同,即为用户提供半满的对象,并让其余的按需加载。
水合作用总是在懒洋洋地或急切地进行,它是冬眠的东西 延迟加载只是为了方便

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

答案 5 :(得分:0)

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

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

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