You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

哪个TeamDTO类结构正确?DTO属性应使用DTO还是实体类?

DTO属性应该用DTO类还是实体类?

我正在学习DTO相关知识,有一个问题想请教:以下两个示例中,哪一种是正确的DTO类编写方式?

第一个示例

package com.example.matchescrud.dto;

import com.example.matchescrud.dto.response.MatchResponseDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

@AllArgsConstructor
@NoArgsConstructor
@Data

public class TeamDTO {
    private Long id;
    private String name;
    private DivisionDTO division;
    private CityDTO city;
    private StadiumDTO stadium;
    private List<MatchResponseDTO> homeMatches;
    private List<MatchResponseDTO> awayMatches;
}

第二个示例

package com.example.matchescrud.dto;

import com.example.matchescrud.model.entity.City;
import com.example.matchescrud.model.entity.Division;
import com.example.matchescrud.model.entity.Match;
import com.example.matchescrud.model.entity.Stadium;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

@AllArgsConstructor
@NoArgsConstructor
@Data

public class TeamDTO {
    private Long id;
    private String name;
    private Division division;
    private City city;
    private Stadium stadium;
    private List<Match> homeMatches;
    private List<Match> awayMatches;
}

答案:第一个示例的写法是正确的,DTO的对象属性应该使用DTO类而非普通实体类,原因如下:

  • 解耦需求:DTO的核心作用是在不同层(比如服务层和前端)之间传输数据,需要和数据库实体类解耦。如果直接引用实体类,会把实体类的JPA注解、内部关联逻辑等无关内容带到传输层,增加模块间的耦合度,还可能引发序列化异常(比如懒加载字段未初始化导致的错误)。
  • 精准控制数据:实体类通常包含数据库相关的全量字段(如创建时间、版本号、内部状态字段),而DTO只需要暴露业务或前端需要的字段。使用嵌套DTO可以按需定义传输的数据结构,避免冗余数据传输,同时降低敏感数据泄露的风险。
  • 提升维护性:当实体类结构因数据库变更调整时,只要DTO的对外数据契约不变,就不会影响客户端;反之,客户端需求变化时,只需修改DTO结构,无需改动实体类,减少了修改范围和潜在风险。

内容的提问来源于stack exchange,提问作者Lucianomp9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:12:42