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