我有一个启用了 spring 和 hibernate 的 Web 应用程序
我有一个用户注册类:
public class SignUpDto {
@NotBlank
@Length(min = 1, max = 50)
private String firstName;
@NotBlank
@Length(min = 1, max = 50)
private String lastName;
@NotBlank
@Length(min = 1, max = 100)
@Email
private String email;
@NotBlank
@Length(min = 8, max = 15)
private String password;
@NotBlank
@Length(min = 8, max = 15)
private String confirmPassword;
@NotBlank
@Length(min = 10, max = 12)
@Phone
private String phone;
@NotNull
private UserType userType;
....
和相应的 hibernate 实体对象是:
@Entity
@Table(name = "user")
public class UserEo extends BaseEo {
private static final long serialVersionUID = 1L;
public UserEo() {
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "use_id")
private Long id;
@Column(name = "use_title")
private String title;
@Column(name = "use_name")
private String name;
@Column(name = "use_email")
private String email;
@Column(name = "use_password")
private String password;
@Column(name = "use_type")
private String type;
@Column(name = "use_registered")
private Timestamp registered;
@Column(name = "use_phone")
private String phone;
...
所以我担心的是代码字段/setters/getters 在 DTO 和 EO 中被重复,这违反了 DRY 原则
有什么解决这个问题的建议吗?
谢谢 苏雷什
最佳答案
这是使用 DTO 模式时的常见问题,简短的回答是,在您的特定情况下,您可以做的事情不多(有什么?)。现在为更长的答案:
DTO 模式做了两件事 - 一是将您的 API(例如 REST/SOAP API)与您的实现分离。其次,它允许您仅传输消费者所需的信息,而不管您的实现如何。域模型也可以作为构建 DTO 的一部分进行操作。
您的实现具有这两个优点,即使底层实现(您的数据库表)发生变化,您也可以更轻松地维护您的 API 接口(interface)。
一种天真的方法是将实体对象也用作 DTO。这通常是行不通的,因为它违反了上述原则。如果实体利用延迟加载,技术上也有难度。
关于java - 具有 DTO 和 EO 的 DRY 原则,用于启用 spring 和 hibernate 的 webapp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25096388/