更好的DTO方法?

时间:2012-07-31 05:09:58

标签: java spring oop spring-mvc

我正在使用SpringMVC,JPA2开发一个简单的论坛Web应用程序。 我创建了像User,Forum,Post等JPA实体,它们反映了数据库表结构。

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

例如:更改密码屏幕。在这里,我需要持有Old Pwd,New Password和Confirm New Pwd。但是User实体不会有Old / New / Confirm Pwd字段,只有密码。所以我需要创建DTO,它们只是Web和服务层之间的数据载体。

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

例如:对于编辑用户界面,

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

有了这个,我可以将底层的User实体传递给我的服务层。但是在将UI属性绑定到DTO时,我需要关联PropertyEditors。

(或)

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

通过这种方法,我需要转换&将DTO属性复制到JPA实体并传递到服务层。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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