当前位置: 首页 > 知识库问答 >
问题:

更好的DTO方法?

段干华晖
2023-03-14

我正在开发一个简单的论坛Web应用程序使用SpringMVC, JPA2.我创建了反映数据库表结构的JPA实体,如用户、论坛、帖子等。

但是,当在UI上显示数据时,我需要DTO,因为我不能始终使用实体保存要在UI上显示的数据。

例如:更改密码屏幕。在这里,我需要持有旧Pwd,新密码和确认新Pwd。但是用户实体没有旧/新/确认Pwd字段,它只有密码。所以我需要创建DTO,它只是网络和服务层之间的数据载体。

我的问题是,在创建DTO对象时,我应该将所有属性放在DTO本身中,还是将实体包装在DTO中并添加所需的其他属性?

例如:对于编辑用户屏幕,

public class UserDTO
{
     private User user; // User is a JPA entity
     // setters & getters
}

有了它,我可以将底层用户实体传递给我的服务层。但在将UI属性绑定到DTO时,我需要关联PropertyEditor。

(或)

public class UserDTO
{
    private String userId;
    private String userName;
    private String password;
    // setters & getters
}

使用这种方法,我需要转换

哪种方法更好?或者有没有其他完全没有DTO的方法?

共有1个答案

邬令
2023-03-14

第一种方法仍然将实体对象本身带到表示层。如果您有其他不是来自数据库的参数,并且您的持久性上下文仍然可用,那么这种方法就足够了。

第二种方法需要重复代码,这并不理想。

如果持久性上下文不可用,我建议使用EntityManager将实体与持久性上下文分离。detach(),而不是创建bean的并行层次结构。

另一方面,如果数据来自表示层,则需要从数据库中加载实体(使用find()或类似的方法)并对其进行更新,或者将其合并到持久性上下文中。

 类似资料:
  • Edit:是我现在正在做的事情,但是由于只是返回,所以这似乎是对Map的误用。另外,它读起来并不像是商业逻辑。 最后编辑:我接受了@Holger的回答。不能期望处理流上的所有元素,因为它不是终端操作。也是如此。即使您可能已经终止了您的流,以保证它将处理所有操作,您也不应该编写期望每个用户都这样做的代码。因此,要进行处理,您应该在上使用,然后根据需要再次开始对进行流式处理。

  • 问题内容: 我有两个不同形状的numpy数组,但是长度(引导尺寸)相同。我想对它们中的每一个进行混洗,以使相应的元素继续对应-即相对于其前导索引一致地对它们进行混洗。 该代码有效,并说明了我的目标: 例如: 但是,这感觉笨拙,效率低下且速度慢,并且需要复制数组-我宁愿就地对它们进行混洗,因为它们会很大。 有没有更好的方法来解决这个问题?更快的执行速度和更低的内存使用是我的主要目标,但是优雅的代码也

  • 我可以通过一个CURL请求发布到我用C#从PHP编写的web服务,但是我无法正确地完成请求。无论我做什么,我能让帖子显示出来的唯一方法是我表单数据头。因此,我的PHP代码最终是这样的: 当我设定路线时: 到: PHP中没有错误,C#服务不返回错误(我在配置中设置了返回异常),函数上的断点永远不会被命中。 在C#端,我的接口和服务设置如下: 当断点命中时,我能够看到的值为: 我希望的值简单地为: 有

  • 问题内容: 哪种资本化方法更好? 矿: 要么 公用语言-StringUtils.capitalize: 我认为我更好,但我宁愿问。 问题答案: 表现是平等的。 您的代码复制了char []调用和。 关于Apache代码和。apache代码有一个额外的字符串实例,该实例具有基本char [1,length]内容。但这在创建实例String时不会被复制。

  • 问题内容: 我是SQLAlchemy新手。 假设我在声明模式下有一个用户表: 当我知道没有将对象加载到会话中的用户ID时,我会像这样更新该用户: 我不喜欢使用,我应该不再为此担心吗? 有一个更好的方法吗? 谢谢! 问题答案: 在ORM级别上也有一些更新功能。它还不能处理任何棘手的情况,但是对于单行更新(或批量更新)的普通情况,它可以正常工作。它甚至会遍历所有已加载的对象,并将更新应用于它们。您可以

  • 我有一个DTO。 现在,我想使用SpringCloudConfig使其可配置。 在我的 文件中: 我的配置类: 现在我的DTO将会是: 在 Spring Boot 的 DTO 中包含 @Configuration 类是一种不好的做法吗?