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

|| 假设我是关于DTO主题的新手。 我不知道将DTO与JSF,Spring和Hibernate一起使用是否正确。 让我解释一下,到目前为止,我已经在业务层和表示层中使用了直接从数据库创建的实体bean。 现在,我决定尝试使用DTO方法,但是我不明白它们如何提供帮助。 例如,如果我有两个类User和Message,而一个用户有更多关联的消息;如何从数据库填充DTO?还是在业务层手动填充DTO? 有人可以发布有关如何使用DTO的示例吗? 先感谢您。 问候, 罗伯托     
已邀请:
DTO代表数据传输对象。它应该是普通的Javabean类,没有任何API /体系结构特定的限制,例如JSF,JPA或Spring注释。即它不应包含任何指向外部API的“ 0”或FQN。唯一的目标是能够在大型模块化Web应用程序的不同体系结构之间传递数据。 例如,如果您不希望将JPA / Hibernate实体Bean用作JSF托管Bean的模型属性并进行查看,因为由于某些过于严格的业务或模块化原因,它们可能无法传递到EJB类之外,那么您可以需要创建此类的副本并自己映射松散属性。基本上:
UserEntity userEntity = em.find(UserEntity.class, id);
UserDTO userDTO = new UserDTO();
userDTO.setId(userEntity.getId());
userDTO.setName(userEntity.getName());
// ...
return userDTO;
有很多可用的库,可以通过以下方式简化bean到bean的映射:
SomeLibary.map(userEntity, userDTO);
但是,对于一般的Web应用程序,您不需要DTO。您已经在使用JPA实体。您可以继续在JSF Bean /视图中使用它们。 仅此一个问题就已经表明您实际上根本不需要DTO。您不受某些特定业务限制的约束。然后,您不应该搜索设计模式,以便可以将其应用到项目中。您应该以过于复杂/无法维护/重复的代码形式搜索实际问题,以便可以为其请求/找到合适的设计模式。通常,重构重复代码几乎会自动引入新的设计模式,而无需您真正意识到它。 一个很好的例子是当JPA实体出于特定目的而“太大”时(即,该实体包含的属性远远超出了您实际需要的属性)。拥有大量那些部分使用的实体会浪费服务器内存。为解决此问题,您可以仅基于您使用JPQL中的构造函数表达式创建和填充的DTO类的某些属性来创建DTO类/子类。 也可以看看: DAO和JDBC有关系吗? JSF控制器,服务和DAO JSF服务层     
有两种填充DTO的选项-手动或使用诸如commons-beanutils或Dozer之类的实用程序。 DTO背后的总体思想是,它们用于跨体系结构层传输数据-最常见的是松散耦合的层,例如通过Web服务或JMS。 DTO也可以在视图中使用,以便Web层获取可用于显示给用户的对象,这些对象与实体不同,以避免实体状态管理问题和映射混乱。 但是对于典型的应用程序,我认为DTO是不必要的。在JSF bean和视图中使用您的实体时,请小心可能出现的“ 3”。我的经验表明,在大多数情况下,可以稍微多一些注意将实体用作DTO(无需新类)。无论我在较小的项目中看到过DTO哪里,它们都只会不必要地使事情复杂化。     

要回复问题请先登录注册