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

2022-08-31 11:08:57

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

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

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

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

最初,不填充集合。books

我的理解是从数据库加载集合的过程称为“补水”集合。books

这个定义是否正确,这个词是常见的地方吗?对于此过程,我应该使用另一个更常见的术语吗?


答案 1

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

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

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

这种语言风格的 BizTalk 扩展,特别是 Dehydrated 是多余的。我希望人们没有忘记如何说,空洞清晰

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

在这一点上,Hibernate和其他ORM产品已经使用这些术语多年,因此Hydrate(和Dehydrate)将继续存在。


答案 2

实体加载状态

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

Entity loaded state

如果实体未存储在二级高速缓存中,那么将执行查询并将 JDBC 转换为包含加载时实体属性值的 。ResultSetObject[]

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

将加载状态转换为 Java 实体对象的过程称为水合,如下所示:Object[]

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

加载的状态作为 EntityEntry 对象保存在当前运行的持久性上下文中,稍后将用于默认的脏检查机制,该机制将当前实体数据与加载时快照进行比较。

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

将实体转换为 在绑定 的 SQL 参数值 或 语句时使用的反向操作称为脱水Object[]INSERTUPDATEDELETE


推荐