JAVA:实体和DTO之间的区别

Dis*_*ame 15 java entity dto

DTO和实体之间有什么区别?详细信息以下是我的问题:

  1. DTO应该有哪些领域?例如,我的实体类是:

    @Entity
    public class MyFirstEntity implements Serializable {
    
        @Id @GeneratedValue
        private Long id;
    
        private String stringData;
    
        @OneToOne
        private MySecondEntity mySecondEntity;
    
        @OneToMany
        private List<MySecondEntity> mySecondEntitesList;
    
    }
    
    @Entity
    public class MySecondEntity implements Serializable {
    
        @Id @GeneratedValue
        private Long id;
    
        private Integer integerData;
    
        @ManyToOne
        private MyFirstEntity myFirstEntity;
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

有一个单向连接(一对一)和一个双向连接(多对一),一个简单的字符串和整数数据,当然还有ID.什么,从他们把在MyFirstDTOMySecondDTO班?

  1. 如果实体之间存在继承,那么我应该如何在DTO中表示它?例如:

    @Entity
    public class MyFirstEntity extends MySecondEntity {
        ....
    }
    
    @Entity
    public class MyFirstDTO extends MySecondDTO {
        ....
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我应该如何使用它们?例如,我发现了这一点:我正在开发一个Web项目.网页的用户想要注册.他/她填写表格,并将其发送到服务器.在服务器端,我首先创建一个DTO,因为它的字段具有验证.从DTO我创建一个实体并将其持久化到数据库.当有实体请求时,我将请求的实体转换为DTO,并将其提供给客户端的用户.是不是很好的想象力?

And*_*ogl 25

简短回答:

  • 实体可以是业务域的一部分.因此,它们可以实现行为并应用于域内的不同用例.

  • DTO仅用于将数据从一个进程或上下文传输到另一个进程或上下文.因此,它们没有行为 - 除了非常基本的和通常标准化的存储和检索功能.

答案很长:

虽然术语"数据传输对象"(DTO)被非常明确地定义,但术语"实体"在各种上下文中被不同地解释.

在我看来,对"实体"一词的最相关解释是以下三种:

  1. 在企业java和jpa的上下文中:
    "表示在数据库中维护的持久数据的对象."

  2. 在"域驱动设计"(Eric Evans)的背景下:
    "一个主要由其身份而不是其属性定义的对象."

  3. 在"清洁架构"(Robert C. Martin)的背景下:
    "一个封装企业级关键业务规则的对象."

Jee和Jpa社区将实体主要视为映射到数据库表的对象.这种观点与DTO的定义非常接近 - 这就是大部分混淆可能源于此的地方.

然而,在域驱动设计的背景下,以及Robert Martins的观点,实体是业务领域的一部分,因此可以而且应该实现行为.

  • 我在理解 DTO 和实体应该如何实现方面遇到了一些困难。在这篇[博客文章](https://blog.cleancoder.com/uncle-bob/2019/06/16/ObjectsAndDataStructures.html)中,R. Martin 说 DTO 是数据结构。因此,ORM 框架并不构建业务对象,而是提取业务对象所操作的数据。但我如何正确地实现这种区别呢?我应该定义一个包含由 ORM 提取的 EmployeeDTO 的 EmployeeEntity 吗?我一直认为我的实体类(业务对象)必须由 ORM 映射。 (2认同)

小智 22

DTO和实体之间的区别:

实体是映射到表的类.Dto主要是映射到"视图"层的类.需要存储的是实体,需要在网页上"显示"的是DTO.

示例:如果我想按如下方式存储员工模型:以员工为例,我需要存储男性/女性/其他性别.但是在JSP上我需要将所有三个值显示为'options',以便用户可以选择一个.

@Entity
public class Employee{
//annotate with @Id and others

private Long id;
private String name;
private Gender gender; //this is enum viz Male,female
}
//Now extend Dto with employee

public EmployeeDto extends Employee{
Gender[] genders=Gender.values(); //put all gender types in array.
}
Run Code Online (Sandbox Code Playgroud)

虽然渲染jsp我们可以给

<select name="gender"> //pointed towards entity gender field.
  <option value="Male">Male</option>
  <option value="Female">Female</option>
  <option value="Other">Other</option>
</select>
Run Code Online (Sandbox Code Playgroud)

然后在春天或其他一些框架中选择哪一个将在实体中选择性别.这是可能的,因为Dto具有所有三个性别价值观.同样,根据情况,事情随之而来. 由于我们主要需要jsp上的大多数实体字段,因此我们按实体扩展dto.

  • -1。DTO通常称为通过架构边界传递数据的对象。尽管可以将它们用于将数据传输到表示层,但此特定用法并未定义它们。 (2认同)

Rza*_*sar 11

简单讲:
DTO 代表数据传输对象。DTO 主要用于在服务(Web 服务、API 等)之间传输数据,这些数据可以包含不同实体(有或没有 ID)的各种属性。将此行作为 DTO 的示例:假设购物网站将通过 Web 服务将其运输请求发送到运输公司。它的 DTO 会是这样的:CustomerFullName, ShippingFee, ShippingAddress。在此示例中,是实体的属性+CustomerFullName的组合,并且是对其他一些实体进行目的地、税收等多个流程的结果。FirstNameLastNameCustomerShippingFee

相反,实体是一组属性,它们聚集起来表示具有特定 ID 的单个实体(例如,TeacherStudentEmployee等)。换句话说,DTO 是聚集在一起发送给客户端的一堆无意义的属性,DTO 不一定与其他 DTO 存在关系,而实体包含与其他实体具有有意义关系的特定对象的属性。在关系数据库范例中,我们可以将 DTO 视为视图的行,而实体是带有主键的表的行。@Shatayu Darbhe 在他/她的回答中也提到了这一点。

然而,模型是这两者的组合。模型可以包含多个相关实体以及额外的数据来处理现实世界的应用程序/UI 问题。考虑一个名为的模型,CustomerOrdersModel其中包含Customer实体、List<Order>实体和一个额外的布尔标志,该标志PayWithCredit指定用户是否要使用借记卡或信用卡付款。


Joh*_*icz 7

“实体”是指整个系统数据的组成单元。它们通常代表业务对象,例如:银行帐户、员工、产品等。它们可用于将系统状态保存到数据库中。

“数据传输对象”是为了特定目的而传输的数据的临时集合。例如,向最终用户显示特定类型的产品列表。您不想将表示每个产品实体的所有数据发送给用户,而只想将为此目的所需的数据发送给用户。

Microsoft 2014 MVC 文档解释了为什么要从实体创建 DTO。这些是他们建议您将实体转换为 DTO 的一些示例。

  • 删除循环引用。
  • 隐藏客户端不应该查看的特定属性。
  • 省略一些属性以减少有效负载大小。
  • 展平包含嵌套对象的对象图,使它们对客户来说更方便。
  • 避免“过度发布”漏洞。(有关过度发布的讨论,请参阅模型验证。)
  • 将服务层与数据库层分离。

但重要的是要明白,这些都不是需要遵守的硬性规则。这完全取决于什么数据最适合发送给您的客户以及什么格式对您的客户最有用。

客户需要对数据做什么?

  • 会被编辑还是只是查看?
  • 客户关心 int 列表的顺序吗?
  • 是否需要插入或删除 int ?
  • 列表需要重新排列吗?

客户是否需要了解一对一或一对多关系或继承的事实?发送此信息可能只会给客户端增加不必要的复杂性。

在决定向客户端发送哪些数据以及如何发送数据之前,需要回答这些问题和其他问题。