【问题标题】:why not hierarchy from entity to create dto?为什么不从实体层次结构创建 dto?
【发布时间】:2017-05-10 02:03:57
【问题描述】:

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

这不是一个大系统,如果需要,这些方法将帮助我们在以后创建真正的 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());
    }
}

谢谢狐狸!

【问题讨论】:

    标签: java jpa hierarchy pojo dto


    【解决方案1】:

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

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

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

    如果您的模型如此简单并且会保持这种状态,那么只需使用实体模型即可。如果在 90% 的用例中无论如何您都需要所有数据,那么使用 DTO 将无济于事。

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

    当然,您可以将 DTO 用于过滤目的,这就是通常所说的按示例过滤,但您会注意到这有一定的限制和怪癖,所以在某些时候您需要一个不同的方法。

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

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多