Java DTO的最佳设计是什么?

Java DTO的最佳设计是什么?,java,spring,jpa,Java,Spring,Jpa,这是我的实体类 @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(updatable = false, insertable = false) private int id; @Column(nullable = false, updatable = fals

这是我的实体类

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(updatable = false, insertable = false)
    private int id;

    @Column(nullable = false, updatable = false)
    private String name;

    @Column(nullable = false, unique = true, updatable = false)
    private String email;

    @Column(name = "nick_name", nullable = false, unique = true, updatable = false)
    private String nickName;

    @Column(name = "image_url")
    private String imageUrl;

    User() {

    }

    public User(int id, String name, String email, String nickName, String imageUrl) {
        this.name = name;
        this.email = email;
        this.nickName = nickName;
        this.imageUrl = imageUrl;
        this.id = id;
    }

    //getters
}
首先,我认为应该基于业务逻辑创建单独的DTO。 比如说,

用于创建的命名DTO

public class CreatingUser {
    private int id;
    private String name;
    private String nickName;
    private String emaial;
    private String imageUrl;

    //getters and setters
}
但问题是,它是由许多对象创建的,很难命名(例如,CreatingUser、CreatingUserWithImage…等等)。 我可能正在为DTO创建许多服务和转换

现在,

我只使用一个dto,但我认为这不是最好的方法


给我一些建议。

创建DTO的最佳实践是为应用程序中的每个请求创建DTO。例如,用于更改密码“ChangingPasswordRequest.java”的DTO仅具有以下属性:

public class ChangingPasswordRequest {
       private String password;
       private String passwordConfirm;

       //getters and setters
}
您可以创建任意数量的dto,并将其命名为操作,如ChangingPasswordRequest.java或EditUserProfileRequest.java或AddWhateverRequest.java


如果某些DTO具有相同的属性(相同的代码),则可以按父类使用继承,并从子类扩展继承。

将单一责任作为优先事项,并创建所需数量的DTO。因为您“必须”必须按照要求创建DTO。为什么会混淆?许多DTO都有相同的字段,它们需要类似的转换和服务。是吗?谢谢你的回答:)
public class ChangingPasswordRequest {
       private String password;
       private String passwordConfirm;

       //getters and setters
}