创建Client时Post请求DTO:传入Trainer ID还是完整对象?
问题:创建Client时的DTO设计选择
我定义了如下Client实体,每个Client仅关联一个Trainer:
@Entity @Table(name = "Client") public class Client { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @ManyToOne private Trainer trainer; // getters and setters }
创建Client时只能关联已存在的Trainer,不会传入新的Trainer进行持久化。现在纠结创建Client的Post请求DTO该用哪种形式:
第一种:仅传入trainerId
{ "id": 123, "trainerId": 456 }
需要后端通过ID查询Trainer后关联到Client实体;
第二种:传入包含id的Trainer对象(可附带其他字段)
{ "id": 123, "trainer": {"id":456} // + other existing trainer fields }
推荐方案及分析
优先选择仅传入trainerId的DTO形式,理由如下:
- 前端实现更简单:不用构造完整的Trainer对象,只传一个ID就行,少写代码还减少数据传输量。
- 语义直白:一眼就能看出来是要关联已存在的Trainer,不会让前端误以为可以传新的Trainer数据,也避免多余字段带来的误解。
- 后端处理更高效:直接用trainerId查Trainer就行,甚至可以用JPA的
EntityManager.getReference()获取代理对象,不用真的查库,性能更好,逻辑也清晰。
至于第二种传入Trainer对象的形式,不推荐的原因:
- 多了一层嵌套,前端没必要额外构造对象,纯纯增加复杂度。
- 如果前端顺手传了Trainer的其他字段,后端还得做校验忽略这些字段,平白增加工作量。
- 语义模糊,容易让前端产生“是不是可以修改Trainer信息”的误解,反而增加沟通成本。
内容的提问来源于stack exchange,提问作者java12399900
相关产品推荐
相关产品推荐

