VO 与 DTO、Entity 的区别

VO 与 DTO、Entity 的区别

特性 DTO Entity VO
主要用途 数据传输(前后端、系统间通信) 数据持久化(映射数据库表,执行 CRUD 操作) 用于表示业务逻辑中的值对象,通常是计算结果或者业务数据
是否持久化 否(通常不持久化) 是(持久化到数据库) 否(通常不持久化)
是否有标识 通常不带唯一标识(例如:ID) 通常带有唯一标识符(如:ID,数据库主键) 不一定带有唯一标识符
字段内容 通常用于展示、数据传输,包含前端或外部接口需要的字段 与数据库表的字段一一映射,包含数据库表的所有字段 主要用于表示一组业务相关的数据,不一定映射到数据库
领域逻辑 不包含业务逻辑 可以包含一些与数据库操作相关的逻辑 可以包含与业务逻辑相关的计算或行为
生命周期 在请求-响应周期内存在 与数据库事务生命周期一致 通常是短生命周期,只在内存中存在

1. 用途与设计

  • DTO

    • 用于 数据传输,通常是在系统间传递数据,可能会传递多个实体数据,结构简洁,避免暴露数据库的实现。
    • DTO 关注 数据格式接口交互
  • Entity

    • 用于与 数据库 交互,通常与数据库表一一映射,具备 数据库表结构 的字段。
    • Entity 关注 数据持久化数据库操作
  • VO

    • 用于 表示业务层中的值对象,是业务逻辑中的一部分,常用于封装和传递一些 计算结果业务数据
    • VO 关注 领域模型值的表示

2. 具体用途

  • DTO 主要用于前后端数据交互,通常会根据前端接口需求调整字段,而不关注实际的业务逻辑。
  • Entity 用于数据库操作,通常会在数据库中有对应的表。
  • VO 通常是业务层使用的对象,它不关注持久化,只关心如何表示某些业务数据,通常是聚合数据或者计算结果。

3. 字段内容

  • DTO 的字段是根据 外部接口需求 设计的,通常包含从前端请求获取的数据或者要返回给前端的数据。它的结构可能非常灵活,根据前端的需求进行设计。
  • Entity 的字段与 数据库表字段 一一对应,包含需要进行持久化操作的所有数据。
  • VO 的字段代表了业务相关的 ,它通常不与数据库字段一一对应,而是用于封装某个特定业务操作或计算结果的值。例如:汇总、统计、分页查询结果。

4. 领域逻辑

  • DTO 一般不包含 业务逻辑,它的主要作用是进行数据传输。
  • Entity 可以包含与数据库相关的业务逻辑,如数据验证、关系映射等。
  • VO 可能包含与 业务逻辑 相关的计算方法,例如:价格计算、折扣计算等。

5. 生命周期

  • DTO 通常是短生命周期的对象,存在于请求-响应周期内,完成数据传输任务后销毁。
  • Entity 的生命周期通常与数据库事务一致,它用于保存数据并可能与长期存储相关。
  • VO 的生命周期与业务流程紧密相关,通常在内存中存在,用于封装和表示某些特定业务的数据。

与 DTO 和 Entity 的比较

  • DTO:用来传递数据,可能会将 OrderVO 中的部分字段进行封装,像是 orderId, customerName, totalAmount 等。
  • EntityOrderEntity 会映射到数据库的 order 表,包含完整的订单信息,包括创建时间、更新时间等。
  • VOOrderVO 仅用于 展示和计算,例如汇总信息、分页结果、展示特定字段等,并且它并不需要持久化。

总结

  • DTO(数据传输对象)用于数据传输,通常用来封装和传递数据,尤其是跨越不同系统、层之间的通信。
  • Entity(实体类)用于数据持久化,代表数据库中的一张表,并且通常与数据库操作(CRUD)紧密关联。
  • VO(值对象)则是用于 表示特定的业务值,它可以包含一些计算、聚合、格式化等业务逻辑,通常用于展示或传递一些业务相关的数据。

它们的职责不同,但常常在一个应用中并行使用,通过层次化的设计,让数据的传输、展示和持久化分别得到高效管理。

你可能感兴趣的:(编程小记,DTO,java,VO,Entity,开发,个人开发)