【问题标题】:DTO pattern with JPA hibernate使用 JPA 休眠的 DTO 模式
【发布时间】:2020-09-19 09:46:12
【问题描述】:

我正在关注this tutorial 关于 DTO 并检查将实体转换为 DTO 的方式。我想知道惰性关系是什么意思,如果在将其转换为DTO的那一刻,我需要获取数据才能将其设置为DTO类?我总是需要先获取数据,所以我设置它是懒惰还是渴望?

【问题讨论】:

  • 这取决于你的序列化的细节。特别是,如果您只使用 ID 序列化相关实体(避免循环的好主意),您的 JPA 提供程序可能不需要获取惰性实体。
  • 我不明白你的意思..按照本教程的思路,将所有数据从实体传输到DTO,然后使用DTO进行操作。
  • 超越 turorial,如果您的 DTO 不是持久实体的直接映射,事情就会变得有趣。如果您的 DTO 是两个不同对象的聚合,不需要任何相关实体怎么办?偷懒,那就是胜利了。这是想要提前获取数据(以及如何获取数据,例如 JOIN 与单独的 SELECT)与及时获取数据之间的权衡(或逐个调整)。
  • 如果我有一个/两个具有惰性关系的实体,在它与 DTO 映射的那一刻,我需要从孩子那里获取数据,所以,惰性关系没有任何意义。我需要在 DTO 中保存所有数据,因为我不知道什么时候需要它。我不确定你是否明白我的意思。也许我没有正确解释

标签: java hibernate jpa dto


【解决方案1】:

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

渴望与懒惰是在“我需要多久加载一次关系”与“加载关系需要多少成本”之间的设计权衡?

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

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

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

将整个数据库加载到内存中通常是不可接受的成本。

等等。还有更糟的。

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

即使是单个Perosn,我也已经再次加载了整个数据库。

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

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

这是危在旦夕:不要为单个实体加载整个 2 亿行表。

【讨论】:

  • 好的,明白了。无论如何,我正在考虑将 DTO 映射到实体的方式,当您要求该地区的人民到 DTO 时,它会转到实体并将数据请求到数据库,不知道这是否可能或存在或其他。无论如何,谢谢你的解释
【解决方案2】:

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

【讨论】:

  • 对不起,这不是问题,我知道区别,我知道获取模式的种类,请再读一遍问题
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多