JPA休眠的DTO模式
DTO pattern with JPA hibernate
我正在关注 this tutorial DTO 并检查将实体转换为 DTO 的方法。我想知道惰性关系是什么意思,如果在将其转换为DTO的那一刻,我需要获取数据才能将其设置为DTO class?我总是需要先获取数据,那么设置为惰性还是急切有关系吗?
在延迟加载中,仅当显式调用子 class 的 getter 时才加载子 class 值。但是对于预先加载,在调用父级时,它的所有子级 class 都已经加载了值。
与延迟加载相比,预加载更慢并且消耗更多内存。
我建议您将您的观点从“我的 DTO 需要什么”转移开,因为这会影响判断。
Eager 与 lazy 是“我需要多久加载一次关系”与“加载关系需要多少成本”之间的设计权衡?
举个极端的例子。你有一个持久实体,比如 Region
。 Region
与生活在这个 Region
中的所有人(Person
实体)有关系。而且人(Person
)可以互相认识。
假设您 eager
获取此实体图中的所有内容,并且您需要加载屏幕的所有区域(不是人,只有区域)。
加载所有 Region
将急切加载所有 Person
住在那里。但是由于人们彼此认识并且这也会被急切加载,因此您将 整个数据库 加载到内存中只是为了显示区域。
将整个数据库加载到内存中通常是 unacceptable 成本。
等等。还有更糟的。
假设我要编辑单个 Person
。所以我加载它。这会急切地获取 Person
的 Region
。它急切地获取该区域中的所有 Person
个实例。它还会获取此人知道的所有其他 Person
,进而获取其他 Person
的 Region
,并一直向下递归。
即使是单个 Perosn
我也重新加载了整个数据库。
这是否意味着您永远不应该急切获取?号
它的意思是:当您知道经常需要数据时,您可以将预先获取放在一起,并且您可以直接和间接地控制获取将产生的数据量。
这就是关键所在:不要为单个实体加载整个 2 亿行 table。
我正在关注 this tutorial DTO 并检查将实体转换为 DTO 的方法。我想知道惰性关系是什么意思,如果在将其转换为DTO的那一刻,我需要获取数据才能将其设置为DTO class?我总是需要先获取数据,那么设置为惰性还是急切有关系吗?
在延迟加载中,仅当显式调用子 class 的 getter 时才加载子 class 值。但是对于预先加载,在调用父级时,它的所有子级 class 都已经加载了值。 与延迟加载相比,预加载更慢并且消耗更多内存。
我建议您将您的观点从“我的 DTO 需要什么”转移开,因为这会影响判断。
Eager 与 lazy 是“我需要多久加载一次关系”与“加载关系需要多少成本”之间的设计权衡?
举个极端的例子。你有一个持久实体,比如 Region
。 Region
与生活在这个 Region
中的所有人(Person
实体)有关系。而且人(Person
)可以互相认识。
假设您 eager
获取此实体图中的所有内容,并且您需要加载屏幕的所有区域(不是人,只有区域)。
加载所有 Region
将急切加载所有 Person
住在那里。但是由于人们彼此认识并且这也会被急切加载,因此您将 整个数据库 加载到内存中只是为了显示区域。
将整个数据库加载到内存中通常是 unacceptable 成本。
等等。还有更糟的。
假设我要编辑单个 Person
。所以我加载它。这会急切地获取 Person
的 Region
。它急切地获取该区域中的所有 Person
个实例。它还会获取此人知道的所有其他 Person
,进而获取其他 Person
的 Region
,并一直向下递归。
即使是单个 Perosn
我也重新加载了整个数据库。
这是否意味着您永远不应该急切获取?号
它的意思是:当您知道经常需要数据时,您可以将预先获取放在一起,并且您可以直接和间接地控制获取将产生的数据量。
这就是关键所在:不要为单个实体加载整个 2 亿行 table。