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