小编典典

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

spring

假设我是关于DTO的新手。我不知道将DTO与JSF,Spring和Hibernate一起使用是否正确。
让我解释一下,到目前为止,我已经在业务层和表示层中使用了直接从数据库创建的实体bean。现在,我决定尝试使用DTO方法,但是我不明白它们如何提供帮助。
例如,如果我有两个类User和Message,而一个用户有更多关联的消息;如何从数据库填充DTO?还是在业务层手动填充DTO?有人可以发布有关如何使用DTO的示例吗?


阅读 355

收藏
2020-04-21

共1个答案

小编典典

DTO代表数据传输对象。它应该是普通的Javabean类,没有任何API /体系结构特定的限制,例如JSF,JPA或Spring注释。即,它不应包含任何import指向外部API的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类/子类。

2020-04-21