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

标签 java hibernate spring jsf dto

假设我对 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/

相关文章:

java - 使用 CompareTo 比较数组中的字符串和 double 值?

java - 如何在 Hibernate Criteria 中加入后获取行数?

java - 如何在 Spring Boot 中从原始查询中获取数据?

java - 我应该如何处理 criteria.list() 的未经检查的强制转换?

java - 在日语排序中将拉丁字符排序到末尾

java - 以通用方式重试方法调用

java - Spring批量配置

java - Spring REST 调用响应类型对象有微小差异

java - java中可以有多个堆吗?

java - 子模块中使用的文件路径不正确