Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更好的DTO方法?_Java_Spring_Oop_Spring Mvc - Fatal编程技术网

Java 更好的DTO方法?

Java 更好的DTO方法?,java,spring,oop,spring-mvc,Java,Spring,Oop,Spring Mvc,我正在使用SpringMVC、JPA2开发一个简单的论坛web应用程序。 我已经创建了JPA实体,如用户、论坛、帖子等,这些实体反映了DB表结构 但是,当在UI上显示数据时,我需要DTO,因为我不能始终使用实体保存要在UI上显示的数据 例如:更改密码屏幕。这里我需要持有旧密码,新密码,并确认新密码。但用户实体不会有旧的/新的/确认Pwd字段,它只有密码。所以我需要创建DTO,它只是Web和服务层之间的数据载体 我的问题是,在创建DTO对象时,我应该将所有属性放在DTO本身中,还是将实体包装在DT

我正在使用SpringMVC、JPA2开发一个简单的论坛web应用程序。 我已经创建了JPA实体,如用户、论坛、帖子等,这些实体反映了DB表结构

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

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

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

例如:对于编辑用户屏幕

public class UserDTO
{
     private User user; // User is a JPA entity
     // setters & getters
}
有了它,我可以将底层用户实体传递给我的服务层。但在将UI属性绑定到DTO时,我需要关联PropertyEditor

(或)

使用这种方法,我需要将DTO属性转换并复制到JPA实体中,然后传递到服务层


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

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

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

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


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

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

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

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


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

但是像更改密码屏幕或屏幕显示带有一些聚合结果的Post对象列表这样的场景呢……这里我们需要DTO……对吗?为什么?如果您只需要实体中的一个子集(您已经从数据库中获取了该数据),那么使用整个实体不会有任何额外的开销。如果您也需要其他实体,您可以加载它们并将它们带到表示层。在DataGrid的情况下,我必须显示1到25条记录(实体),保留当前页面,总页面数等,而不是将所有这些细节作为单个参数存储在请求(无论什么)范围中,我想最好是将它们存储在DTO中。明白。编辑我的答案以更好地反映您的需要。但是,对于诸如更改密码屏幕或屏幕显示带有一些聚合结果的Post对象列表之类的场景,我们需要DTO。对吗?为什么?如果您只需要实体中的一个子集(您已经从数据库中获取了该数据),那么使用整个实体不会有任何额外的开销。如果您也需要其他实体,您可以加载它们并将它们带到表示层。在DataGrid的情况下,我必须显示1到25条记录(实体),保留当前页面,总页面数等,而不是将所有这些细节作为单个参数存储在请求(无论什么)范围中,我想最好是将它们存储在DTO中。明白。编辑我的答案以更好地反映您的需要。
public class UserDTO
{
    private String userId;
    private String userName;
    private String password;
    // setters & getters
}