JPA休眠的DTO模式

DTO pattern with JPA hibernate

我正在关注 this tutorial DTO 并检查将实体转换为 DTO 的方法。我想知道惰性关系是什么意思,如果在将其转换为DTO的那一刻,我需要获取数据才能将其设置为DTO class?我总是需要先获取数据,那么设置为惰性还是急切有关系吗?

在延迟加载中,仅当显式调用子 class 的 getter 时才加载子 class 值。但是对于预先加载,在调用父级时,它的所有子级 class 都已经加载了值。 与延迟加载相比,预加载更慢并且消耗更多内存。

我建议您将您的观点从“我的 DTO 需要什么”转移开,因为这会影响判断。

Eager 与 lazy 是“我需要多久加载一次关系”与“加载关系需要多少成本”之间的设计权衡?

举个极端的例子。你有一个持久实体,比如 RegionRegion 与生活在这个 Region 中的所有人(Person 实体)有关系。而且人(Person)可以互相认识。

假设您 eager 获取此实体图中的所有内容,并且您需要加载屏幕的所有区域(不是人,只有区域)。

加载所有 Region 将急切加载所有 Person 住在那里。但是由于人们彼此认识并且这也会被急切加载,因此您将 整个数据库 加载到内存中只是为了显示区域。

将整个数据库加载到内存中通常是 unacceptable 成本。

等等。还有更糟的。

假设我要编辑单个 Person。所以我加载它。这会急切地获取 PersonRegion。它急切地获取该区域中的所有 Person 个实例。它还会获取此人知道的所有其他 Person,进而获取其他 PersonRegion,并一直向下递归。

即使是单个 Perosn 我也重新加载了整个数据库。

这是否意味着您永远不应该急切获取?号

它的意思是:当您知道经常需要数据时,您可以将预先获取放在一起,并且您可以直接和间接地控制获取将产生的数据量。

这就是关键所在:不要为单个实体加载整个 2 亿行 table。