2

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

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

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

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

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

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

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

(或者)

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

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

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

4

1 回答 1

0

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

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

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

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

于 2012-07-31T05:40:08.107 回答