DTO、Model、Entity 的区别与联系
这三者都是软件开发中常用的对象类型,但各自有不同的职责和使用场景:
1. Entity (实体)
- 核心特征:与数据库表直接映射的持久化对象
- 主要职责:
- 代表业务领域中的核心概念
- 直接对应数据库表结构
- 包含数据持久化逻辑
- 特点:
- 通常由ORM框架(如Hibernate)管理
- 可能包含关联关系(一对一、一对多等)
- 生命周期与数据库记录一致
@Entity
@Table(name = "users")
public class User {
@Id
private Long id;
private String username;
private String password;
// getters/setters
}
2. Model (模型)
- 核心特征:业务逻辑的核心表示
- 主要职责:
- 封装业务规则和行为
- 处理业务逻辑
- 可能是领域驱动设计(DDD)中的领域模型
- 特点:
- 比Entity更丰富的业务行为
- 不关心持久化细节
- 可能由多个Entity组合而成
public class OrderModel {
private User buyer;
private List<Product> products;
private BigDecimal total;
public void applyDiscount(Coupon coupon) {
// 业务逻辑
}
}
3. DTO (数据传输对象)
- 核心特征:纯粹的数据容器,用于跨层/跨系统传输
- 主要职责:
- 在不同层或系统间传输数据
- 减少网络调用次数
- 隐藏内部数据结构
- 特点:
- 只有数据没有行为
- 扁平化结构
- 生命周期短暂
public class UserDTO {
private String username;
private String displayName;
private String email;
// 只有getters/setters
}
三者的主要区别
特性 | Entity | Model | DTO |
---|---|---|---|
目的 | 数据持久化 | 业务逻辑封装 | 数据传输 |
行为 | 可能有持久化方法 | 丰富的业务方法 | 无行为 |
结构 | 反映数据库表 | 反映业务概念 | 根据传输需求设计 |
生命周期 | 长 | 中等 | 短 |
使用场景 | 数据访问层 | 服务层/领域层 | 各层间通信 |
典型数据流
数据库 ←→ Entity ←→ Model ←→ DTO ←→ 客户端/外部系统
最佳实践建议
- 不要直接暴露Entity给外部:通过DTO控制数据暴露范围
- Model可以包含业务规则:保持Entity相对简单
- 避免DTO"贫血":虽然DTO主要是数据结构,但可以包含简单的转换方法
- 使用映射工具:如MapStruct、ModelMapper处理对象间转换
理解这些区别有助于设计更清晰、更易维护的分层架构。