gpt4 book ai didi

java - 如何在 JSF + Spring + Hibernate 中使用 DTO

转载 作者:搜寻专家 更新时间:2023-10-31 08:06:11 25 4
gpt4 key购买 nike

假设我对 DTO 这个话题还很陌生。我无法理解将 DTO 与 JSF、Spring 和 Hibernate 结合使用是否正确。
让我解释一下,到目前为止,我在业务层和表示层都使用了直接从数据库创建的实体 bean。现在我决定尝试使用 DTO 方法,但我无法理解它们如何提供帮助。
例如,如果我有两个类 User 和 Message,并且一个用户关联了更多消息;如何从数据库中填充 DTO?还是我在业务层手动填充 DTO?有人可以发布有关如何使用 DTO 的示例吗?

提前致谢。问候,罗伯托

最佳答案

DTO 代表数据传输对象。它应该是一个普通的 vanilla Javabean 类,没有任何 API/体系结构特定限制,例如 JSF、JPA 或 Spring 注释。 IE。它不应包含任何指向外部 API 的 import 或 FQN。唯一的目标是能够在大型模块化 Web 应用程序的不同架构之间传递数据。

例如,如果您不想使用 JPA/Hibernate 实体 bean 作为 JSF 托管 bean 和 View 的模型属性,因为由于某些过度限制的业务或模块化原因,它们可能不会被传递到 EJB 类之外,那么您需要创建此类的副本并自己映射松散属性。基本上:

UserEntity userEntity = em.find(UserEntity.class, id);
UserDTO userDTO = new UserDTO();
userDTO.setId(userEntity.getId());
userDTO.setName(userEntity.getName());
// ...
return userDTO;

plenty of libraries可以通过以下方式轻松实现 bean 到 bean 映射:

SomeLibary.map(userEntity, userDTO);

但是,对于一般的 Web 应用程序,您不需要 DTO。您已经在使用 JPA 实体。您可以继续在 JSF bean/ View 中使用它们。

这个问题本身就已经表明您实际上根本不需要 DTO。您不会被某些特定的业务限制所阻止。您不应该搜索设计模式以便将其应用到您的项目中。您应该以过于复杂/无法维护/重复代码的形式搜索真正的问题,以便您可以为其询问/找到合适的设计模式。通常,重构重复代码几乎会自动引入新的设计模式,而您却没有真正意识到这一点。

一个很好的例子是当 JPA 实体对于特定目的来说“太大”时(即实体包含的属性比您实际需要的多得多)。拥有大量这些部分使用的实体是对服务器内存的浪费。要解决此问题,您可以仅基于您使用 constructor expression 创建和填充的一些属性来创建 DTO 类/子类。在 JPQL 中。

另见:

关于java - 如何在 JSF + Spring + Hibernate 中使用 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5722036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com