Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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 为什么不从实体层次结构创建dto?_Java_Jpa_Hierarchy_Pojo_Dto - Fatal编程技术网

Java 为什么不从实体层次结构创建dto?

Java 为什么不从实体层次结构创建dto?,java,jpa,hierarchy,pojo,dto,Java,Jpa,Hierarchy,Pojo,Dto,是否有任何理由不使用实体/模型的层次结构来创建帮助您保存表单搜索字段的dto/表单对象 这不是一个大系统,如果需要,这些方法将帮助我们以后创建真正的dto 我们的模型是简单的POJO,几乎具有任何逻辑,可能有一些验证逻辑,但这也适用于DTO 使用所有字段创建新的DTO对象是没有意义的 public class User { private String name; private String email; private Date onboardingDate;

是否有任何理由不使用实体/模型的层次结构来创建帮助您保存表单搜索字段的dto/表单对象

这不是一个大系统,如果需要,这些方法将帮助我们以后创建真正的dto

我们的模型是简单的POJO,几乎具有任何逻辑,可能有一些验证逻辑,但这也适用于DTO

使用所有字段创建新的DTO对象是没有意义的

public class User {
    private String name;
    private String email;
    private Date onboardingDate;

    public User() {}

    public User(String name, String email, Date onboardingDate) {
        this.name = name;
        this.email = email;
        this.onboardingDate = onboardingDate;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    public Date getOnboardingDate() { return onboardingDate; }
    public void setOnboardingDate(Date onboardingDate) { this.onboardingDate = onboardingDate; }
}
我的DTO类,我可以使用它进行使用创建和搜索

public class UserDTO extends User {
    private Date fromDate;
    private Date toDate;

    public Date getFromDate() { return fromDate; }
    public void setFromDate(Date fromDate) { this.fromDate = fromDate; }

    public Date getToDate() { return toDate; }
    public void setToDate(Date toDate) { this.toDate = toDate; }

    public User convertToEntity() {
        return new User(super.getName(), super.getName(), super.getOnboardingDate());
    }
}

谢谢你,狐狸

通常,DTO将是实体数据的子集,或者还包含子DTO中其他关联的数据,或者直接嵌入到该DTO中。如果DTO扩展了实体,DTO对象的用户将有可能调用getter来访问所有该状态

如果您的DTO真的是DTO,它将只包含数据的一个子集,但是通过从实体扩展,您可能会意外地访问不属于加载的子集的数据

假设您的用户实体具有详细的联系人和地址信息。对于一个用例,您需要该数据,但对于另一个用例,您不需要。为不存在的状态公开getter/setter是没有意义的,是吗?这就是为什么人们通常会为此创建一个单独的DTO类。如果您想要持久化/更新数据,您仍然可以使用实体类型,但即使对于这些用例,人们有时也倾向于使用DTO,因为持久化状态不一定表示可以在用例中更新的状态。当您具有状态时,这一点尤其重要,例如持久状态中的非规范化或交叉关注点(如统计或审计数据)

如果您的模型非常简单,并且将保持这种方式,那么只需使用实体模型。若在90%的用例中,您仍然需要所有数据,那个么使用DTO并没有任何好处

考虑到您需要为您的用例创建实体状态的子集,我只能建议您不要从实体模型进行扩展,而只是对您的用例所需进行建模。永远不要将访问器暴露于DTO中不存在的状态。这将节省您以后数小时的调试时间

当然,您可以将DTO用于筛选目的,这通常被称为示例筛选,但您会注意到这有一定的限制和怪癖,因此在某些情况下,您将需要一种不同的方法


您可以使用我开发的一个名为的库,它允许您创建DTO作为接口。这不仅是对DTO建模的一种更简单的方法,而且它的性能也会更好,因为它只获取所需表示所需的状态。

通常,DTO是实体数据的子集,或者还包含子DTO中其他关联的数据,或者直接嵌入到该DTO中。如果DTO扩展了实体,DTO对象的用户将有可能调用getter来访问所有该状态

如果您的DTO真的是DTO,它将只包含数据的一个子集,但是通过从实体扩展,您可能会意外地访问不属于加载的子集的数据

假设您的用户实体具有详细的联系人和地址信息。对于一个用例,您需要该数据,但对于另一个用例,您不需要。为不存在的状态公开getter/setter是没有意义的,是吗?这就是为什么人们通常会为此创建一个单独的DTO类。如果您想要持久化/更新数据,您仍然可以使用实体类型,但即使对于这些用例,人们有时也倾向于使用DTO,因为持久化状态不一定表示可以在用例中更新的状态。当您具有状态时,这一点尤其重要,例如持久状态中的非规范化或交叉关注点(如统计或审计数据)

如果您的模型非常简单,并且将保持这种方式,那么只需使用实体模型。若在90%的用例中,您仍然需要所有数据,那个么使用DTO并没有任何好处

考虑到您需要为您的用例创建实体状态的子集,我只能建议您不要从实体模型进行扩展,而只是对您的用例所需进行建模。永远不要将访问器暴露于DTO中不存在的状态。这将节省您以后数小时的调试时间

当然,您可以将DTO用于筛选目的,这通常被称为示例筛选,但您会注意到这有一定的限制和怪癖,因此在某些情况下,您将需要一种不同的方法

您可以使用我开发的一个名为的库,它允许您创建DTO作为接口。这不仅是对DTO建模的一种更简单的方法,而且它的性能也会更好,因为它只会获取所需表示真正需要的状态