当前位置: 首页 > 知识库问答 >
问题:

Hibernate中DTO和延迟加载之间的关系是什么

井洲
2023-03-14

我知道什么是DTO:一个在进程之间传输数据以减少方法调用数量的对象。我知道什么是hibernate中的延迟加载。

我在《JHipster的全栈开发》一书中读到这样一句话:JHipster在服务器端使用DTO(数据传输对象)和VM(视图模型)。DTO用于将数据从服务层传输到资源层。它们打破了Hibernate事务,避免了资源层触发进一步的延迟加载。

我不明白DTO和延迟加载之间的关系。

共有3个答案

水恩
2023-03-14

简单地说:如果您调用延迟加载标记字段的getter,Hibernate将对该数据进行db查询。

这是您不应将实体作为后端响应返回的原因之一。。。任何JSON转换(序列化)/getter调用都会触发不必要的数据加载。

而DTO是专门根据使用情况传输数据的,您可以从这些实体创建DTO(可以从一个实体创建多个DTO),并仅选择所需的数据字段

例如,用户实体:具有用户详细信息和好友列表UserDetailsTo:只需要这些详细信息,不需要1000个映射到用户的好友。。。还有他们的朋友。。。UserFriendsTo:我们可以有选择地获取此DTO的好友名称或ID

哈朗
2023-03-14

如果将Hibernate管理的持久性实体传递到启用LazyLoading的资源层,资源层将调用get-方法来读取它们的属性,其中一些属性当时可能尚未初始化。然后,Hibernate将从Perssntet存储延迟加载该特定属性的数据,发送一条SQL语句(可能每次启动并提交一个新事务),并等待相当慢的响应。如果这种情况发生数百次,每次必须初始化另一个属性,每次触发延迟加载,用户必须等待。。。

如果您在服务层中准备了一个DTO,其中包含与资源层相关的所有数据,那么对该DTO的读取访问是非常有效的,而不会因为任何相关的内容都已经在内存中而导致调用数据库的风险。不会触发后续的惰性负载。

公良凯
2023-03-14

懒惰加载适用于实体,而不是DTO。

JPA实体可以表示为POJO或代理。

使用EntityManager。“查找”为您提供了一个POJO:

Post post = entityManager.find(Post.class, postId);

EtityManager.get引用方法为您提供代理:

Post post = entityManager.getReference(Post.class, postId);

POJO已初始化其基本属性,因为已执行SELECT语句来获取实体。代理在创建时不会命中数据库。仅根据提供的实体标识符设置id。只有您访问代理属性,才会执行SELECT语句。

代理也用于使用FetchType的集合(例如,@OneTo多@ManyTo多)。默认情况下为LAZY策略。访问LAZY集合后,将执行SELECT语句来获取关联的集合。

现在,DTO基于投影,因此在填充DTO之前执行SELECT语句。为此,可以说每次都急切地加载DTO。

对于只读投影,DTO比实体更高效,因为您只加载显式请求的表列。

 类似资料:
  • 问题内容: 什么是Java的延迟加载?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设您有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着它在加载父级时实际上并不会加载所有子级。而是在要求时加载它们。您可以显式地请求此请求,或者,更常见的是,当您尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通常您不

  • 本文向大家介绍Hibernate中的延迟加载和渴望加载之间的区别,包括了Hibernate中的延迟加载和渴望加载之间的区别的使用技巧和注意事项,需要的朋友参考一下 Lazy和Eager是ORM中的两种数据加载策略,例如休眠和Eclipse链接。当一个实体类引用其他实体(例如Employee和Phone(员工中的电话))时,我们使用了这些数据加载策略。  延迟加载-仅当我们显式调用getter或si

  • 我试图理解延迟和延迟订阅操作符之间的区别。 本文件描述了延迟操作员: 延迟操作符通过在发出每个源可观察项之前暂停特定的时间增量(您指定)来修改其源可观察项。这会将可观测项发出的整个项目序列在时间上向前移动指定的增量 delaySubscription是这样描述的: 还有一个操作符,您可以使用它延迟对源可观察对象的订阅:delaySubscription。 然而,当我测试这两个操作员的行为时,我觉得

  • 问题内容: Java中的延迟加载是什么?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设你有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着在加载父级时,它实际上并未加载所有子级。而是在要求时加载它们。你可以显式地请求此请求,也可以是更常见的情况,当你尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通

  • 问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最

  • 1、mybatis 是否支持延迟加载? 延迟加载其实就是讲数据加载时机推迟,比如推迟嵌套查询的时机。 延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。 mybatis仅支持关联对象association和关联集合对象collection的延迟加载,association是一对一,collection是一对多查询,在mybatis配置文件中可以配置lazylo