当前位置: 首页 > 知识库问答 >
问题:

实体与DTO的区别

苗运珧
2023-03-14
@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;

}

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

@Entity
public class MyFirstEntity extends MySecondEntity {
    ....
}

@Entity
public class MyFirstDTO extends MySecondDTO {
    ....
}

我应该如何使用它们?例如,我发现:我正在做一个web项目。网页的用户想要注册。他/她填写表单,并将其发送到服务器。在服务器端,我首先创建一个DTO,因为它的字段有验证。我从DTO创建一个实体并将其持久化到数据库中。当有对实体的请求时,我将被请求的实体转换为DTO,并将其提供给客户端的用户。这是一个很好的想象,还是不是?

共有1个答案

曹渝
2023-03-14

简短的回答:

>

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

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

    在“Clean Architecture”(Robert C.Martin著)的上下文中:
    “封装企业范围内关键业务规则的对象。”

    JEE和JPA社区主要将实体视为映射到数据库表的对象。这种观点非常接近DTO的定义--这可能是造成许多混乱的原因。

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

  •  类似资料:
    • 在普通的DDD项目中,我希望从存储库中检索到的实体作为DTO从域层发送到应用层。 CQR存在的一个原因似乎是,应用层所需的查询(主要是读取操作)与域层所需的查询不同。因此,即使是同一对象的查询结果在不同层之间也可能不同。 在我的域层中,我已经将查询结果映射到域实体中。我对一些CQRS示例将查询结果直接映射到跳过匹配实体的DTO感到困惑。 假设数据库返回: 但是,实体布局将姓氏映射为姓氏: 如果在我

    • 问题内容: 我们将使用DTO在表示层之间来回发送数据。我们有像这样的图层: facade appService domain 并且我们使用推土机来帮助我们将实体转换为dto。但是我现在有两个问题: 从实体到dto,我们可以使用推土机,但是从dto到实体,我们可以使用推土机吗?如果是,如何? 我应该在哪里创建实体?在外观或DTOAssembler中? 例如,我必须注册一本书。这本书的实体外观如下:

    • 我希望在我正在从事的一个项目中使用CQR,但是我目前正在努力寻找实现CQR查询端的最佳方法。基于我有限的理解,有一个瘦数据层(有时称为瘦读取层),用于查询数据库并返回DTO,其中包含应用程序UI层使用的查询结果。 由于这是一个Java的EE应用程序,我正在开发薄数据层,使用JPA使用EntityManager.createNamedQuery查询数据库,返回一个包含结果的实体,然后将其映射到DTO

    • 我试图在我的项目中巧妙地使用DTO和实体,但它似乎比它应该的更复杂。我正在构建一个管理库存的后端,我使用NestJs和TypeOrm。 我的客户向我发送了一组数据抛出POST请求,比如: 我的控制器有责任通过使用自定义ValidationPipe检查字段: 我在许多地方读到,在最佳实践中,原始数据应该转换为DTO,当涉及到数据插入时,我应该将DTO转换为类型化实体。 我同意这种方法,但我发现它非常

    • 我有一种情况,在一个DTO中有另一个DTO,我必须映射到它对应的实体。 我正在使用mapstruct,我已经有antherEntityMapper已经存在。 如何更改EntityMapper接口,以便我可以将一个另一个EntityDTO映射到另一个Entity? 谢谢

    • 我继承了一个用Java编写的应用程序,该应用程序使用JPA访问数据库。该应用程序使用了一种我以前从未遇到过的设计模式,并且我会真正了解为什么使用此模式的一些指导。与许多应用程序一样,我们有一个前端、中间件和后端数据库。数据库通过 DAO 访问。DAO上的每个方法都加载一个实体DTO,它只是一个POJO,除了获取器和设置器之外什么都没有,然后该实体DTO被传递到具有更改实体状态的其他方法的实体中。示