我正在使用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的其他方法吗?
答案 0 :(得分:0)
您的第一种方法仍然将Entity对象本身带到表示层。如果您有其他参数不是来自数据库,并且您的持久性上下文仍然可用,那么这种方法就足够了。
第二种方法需要重复代码,这并不理想。
如果持久化上下文不可用,我建议使用EntityManager.detach()从持久化上下文中分离实体,而不是创建bean的并行层次结构。
另一方面,如果数据来自表示层,则需要从数据库加载实体(使用find()或类似的东西)并更新它,或将其合并()到持久化上下文中