2012-07-31 52 views
2

我正在开发一个使用SpringMVC,JPA2的简单论坛Web应用程序。 我创建了像用户,论坛,发布等反映数据库表结构的JPA实体。DTOs更好的方法?

但同时显示UI上的数据,我需要一些DTOs,我不能总是抱着要显示在使用实体UI中的数据。

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

我的问题是在创建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的属性分为JPA实体,并传递给服务层。

哪种方法更好?还是有没有其他方法完全没有DTO?

回答

0

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

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

如果持久化上下文是不可用的,我会建议使用EntityManager.detach(从持久化上下文中分离的实体),而不是创建豆的并行层次。另一方面,如果数据从表示层进入,则需要从数据库(使用find()或类似的东西)加载实体并更新它,或将它合并()成持久性上下文。

+0

但对于像更改密码屏幕或后的屏幕显示列表中的场景与一些聚集results..here我们需要DTOs..right对象? – 2012-07-31 05:43:25

+0

为什么?如果您只需要实体中的一部分数据(您已从数据库中提取数据),那么使用整个实体不会有任何额外开销。如果您还需要其他实体,则可以加载它们并将它们携带到表示层。 – 2012-07-31 05:56:22

+0

对于DataGrid,我必须显示1到25条记录(实体),保留当前页面的内容,总共有多少页面等等。而不是将所有这些细节存储为请求(不管)范围中的单个参数,我认为将它们存储在DTO中会更好。 – 2012-07-31 06:01:11