Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DRY原理,带DTO和EO,适用于支持spring和hibernate的webapp_Java_Spring_Hibernate_Web Applications_Dry - Fatal编程技术网

Java DRY原理,带DTO和EO,适用于支持spring和hibernate的webapp

Java DRY原理,带DTO和EO,适用于支持spring和hibernate的webapp,java,spring,hibernate,web-applications,dry,Java,Spring,Hibernate,Web Applications,Dry,我有一个支持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 St

我有一个支持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;
...
所以我担心的是,DTO和EO中的代码字段/设置器/获取器重复出现,这违反了DRY原则

有什么建议可以克服这个问题吗

谢谢
Suresh

在使用DTO模式时,这是一个常见的问题,简单的回答是,在您的特定情况下,您没有多少(任何?)可以克服这一问题。下面是更详细的答案:

DTO模式做两件事——一是它将API(例如REST/SOAP API)与实现分离。其次,它允许您仅传输消费者所需的信息,而不考虑您的实现。域模型也可以作为构建DTO的一部分进行操作

您的原样实现具有这两个优点,即使底层实现(数据库表)发生更改,您也可以更轻松地维护API接口


一种简单的方法是使用实体对象作为DTO。这通常不起作用,因为它违反了上述原则。如果实体利用延迟加载,在技术上也是困难的。

这是使用DTO模式时的一个常见问题,简单的回答是,在您的特定情况下,您无法做太多(任何?)来克服这一问题。下面是更详细的答案:

DTO模式做两件事——一是它将API(例如REST/SOAP API)与实现分离。其次,它允许您仅传输消费者所需的信息,而不考虑您的实现。域模型也可以作为构建DTO的一部分进行操作

您的原样实现具有这两个优点,即使底层实现(数据库表)发生更改,您也可以更轻松地维护API接口


一种简单的方法是使用实体对象作为DTO。这通常不起作用,因为它违反了上述原则。如果实体利用延迟加载,在技术上也很困难。

为什么不重用用户对象(UserEo)而不是创建DTO?您可以在实体类上使用JSR303(Bean验证)注释而不会出现问题

另一种方法是使用反射或Apache BeanUtils之类的工具


要自动将值从实体复制到DTO。

为什么不重用用户对象(UserEo)而不是创建DTO?您可以在实体类上使用JSR303(Bean验证)注释而不会出现问题

另一种方法是使用反射或Apache BeanUtils之类的工具


自动将值从实体复制到DTO。

,因为通过服务公开实体对象是不好的做法。有一个单独的DTO和实体。让服务返回DTO-s。不要将实体与客户端耦合。由于安全原因,没有那么多字段必须从输出中排除,这样做非常容易,例如通过添加诸如“@XmlTransient”或“@JsonIgnore”之类的注释。我认为对于普通应用程序来说,这比用DTO支持大量重复代码更好。你可以在一个小项目中解决这个问题,也可以出于实践目的。如果开始将验证逻辑与所有JPA注释一起放入实体对象中,那么这个类将看起来非常丑陋,以至于您不了解其中的情况。因为通过服务公开实体对象是一种糟糕的做法。有一个单独的DTO和实体。让服务返回DTO-s。不要将实体与客户端耦合。由于安全原因,没有那么多字段必须从输出中排除,这样做非常容易,例如通过添加诸如“@XmlTransient”或“@JsonIgnore”之类的注释。我认为对于普通应用程序来说,这比用DTO支持大量重复代码更好。你可以在一个小项目中解决这个问题,也可以出于实践目的。如果开始将验证逻辑与所有JPA注释一起放入实体对象中,那么这个类将看起来非常丑陋,以至于您无法理解其中发生了什么。