Skip to content

Java开发中实体对象命名规范及用途

我们通常使用不同的后缀来区分不同用途的实体对象,下面列出常见的几种:

  1. Entity:用于JPA实体,与数据库表对应。
  2. DTO (Data Transfer Object):用于层与层之间传输数据,通常不包含业务逻辑。
  3. VO (Value Object):通常用于前端展示,或者作为值对象。
  4. BO (Business Object):业务对象,包含业务逻辑。
  5. PO (Persistent Object):持久化对象,与数据库表对应,类似于Entity。
  6. POJO (Plain Old Java Object):简单的Java对象,没有特别限制。
  7. Form / Request:用于接收前端请求参数。
  8. Query:用于查询条件封装。
  9. Response:用于返回给前端的响应。
  10. Command:用于存放命令对象(很少情况下简写CMD,不建议简写)。
  11. Message:用于封装消息,通常不包含业务逻辑。

命名建议

对象类型推荐命名示例说明
DTO全大写UserDTO行业标准,广泛接受
VO全大写UserVO行业标准,广泛接受
BO全大写UserBO行业标准,广泛接受
PO全大写UserPO行业标准,广泛接受
Command完整单词UserCommand不建议简写
Request完整单词UserRequest不建议简写
Response完整单词UserResponse不建议简写
Message完整单词UserMessage不建议简写
Form完整单词UserForm不建议简写
Query完整单词UserQuery不建议简写
Command完整单词UserCommand不建议简写

总包名选择标准

  • domain:适合DDD(领域驱动设计)项目
  • model:适合传统MVC架构
  • entity:适合以数据为中心的项目(会跟Entity对象重复,一般不建议使用)
  • data:适合数据访问层明确分离的项目

Entity(实体)

命名方式:直接使用业务名称,或加 Entity 后缀

java
@Entity
@Table(name = "user")
public class User {
// 或 UserEntity
   private Long id;
   private String username;
   private String password;
   private Date createTime;
}

使用场景:

  • 与数据库表直接映射的领域对象
  • JPA/Hibernate/MyBatis等ORM框架使用
  • 包含数据库字段对应的属性和注解

特点:

  • 包含数据库主键、关系映射
  • 通常与数据库表一一对应
  • 可能包含JPA/Hibernate注解

DTO(数据传输对象)

命名方式:业务名 + DTO 后缀

java
public class UserDTO {
   private Long id;
   private String username;
   private String email;
    // 不包含password等敏感字段

    // 转换方法
    public static UserDTO fromEntity(User user) {
        UserDTO dto = new UserDTO();
        dto.setId(user.getId());
        dto.setUsername(user.getUsername());
        dto.setEmail(user.getEmail());
        return dto;
    }
}

使用场景:

  • 不同层之间数据传输
  • 避免暴露Entity的敏感字段
  • 前端与后端接口数据交换
  • 微服务间API调用

VO(值对象/视图对象)

命名方式:业务名 + VO 后缀

java
public class UserVO {
   private Long id;
   private String username;
   private String nickname;
   private String avatar;
   private List<String> roles;
   // 包含前端展示需要的组合数据
}

使用场景:

  • 前端页面展示数据
  • 包含多个Entity的组合数据
  • 特定视图的定制化数据

BO(业务对象)

命名方式:业务名 + BO 后缀

java
public class OrderBO {
   private Order order;
   private List<OrderItem> items;
   private User user;
   private BigDecimal totalAmount;

    // 包含业务方法
    public boolean validateStock() {
        return items.stream().allMatch(item -> 
            item.getProduct().getStock() >= item.getQuantity());
    }
}

使用场景:

  • 业务逻辑处理对象
  • 包含多个Entity的聚合
  • 封装复杂业务规则

PO(持久化对象)

命名方式:业务名 + PO 后缀

java
public class UserPO {
   private Long id;
   private String name;
   // 严格的数据库字段映射
}

使用场景:

  • MyBatis等ORM中的数据库映射对象
  • 与数据库表严格对应

POJO(简单Java对象) 命名方式:简单的业务名称

java
public class User {
   private Long id;
   private String name;
   // 简单的getter/setter,无复杂逻辑
}

使用场景:

  • 简单的数据承载对象
  • 不依赖任何框架
  • 临时数据传输

Form、Request(表单、请求对象)

命名方式:业务名 + Form、Request 后缀

java
public class UserCreateForm {
@NotBlank
private String username;

    @Email
    private String email;
    
    @Size(min = 6)
    private String password;
    // 包含表单验证注解
}

使用场景:

  • 接收前端请求参数
  • 表单数据验证
  • Controller层入参

Query(查询对象)

命名方式:业务名 + Query 后缀

java
public class UserQuery {
   private String username;
   private String email;
   private Integer page;
   private Integer size;
   // 查询条件封装
}

使用场景:

  • 查询条件封装
  • 分页查询参数
  • 搜索过滤条件

Response(响应对象)

命名方式:业务名 + Response 后缀

java
public class UserResponse {
   private boolean success;
   private String message;
   private UserVO data;
   // API响应格式
}

使用场景:

  • API接口统一响应格式
  • 包含状态码、消息等元数据

各层转换关系

text
Controller层: Form/Request → Service层: DTO/BO → Repository层: Entity/PO
↓                              ↓                      ↓
Response ←-------------------- VO ←------------------- Entity

实际应用示例

java
// 用户注册流程示例
@Entity
public class User {
   private Long id;
   private String username;
   private String password;
}

public class UserRegisterForm {
   private String username;
   private String password;
   private String email;
}

public class UserDTO {
   private Long id;
   private String username;
   private String email;
}

public class UserVO {
   private Long id;
   private String username;
   private String nickname;
}

@Service
public class UserService {
   public UserVO register(UserRegisterForm form) {
      // Form -> Entity -> DTO -> VO 转换
      User user = convertToEntity(form);
      user = userRepository.save(user);
      return convertToVO(user);
   }
}

选择原则

  • Entity:严格对应数据库表结构
  • DTO:服务层数据传输,隐藏敏感信息
  • VO:前端展示,聚合多个数据源
  • Form/Request:接收用户输入,包含验证
  • BO:复杂业务逻辑封装

根据项目架构和个人习惯选择,保持团队一致性

页脚:版权前显示的信息