我正在尝试弄清楚如何正确执行此操作。假设我有这样的实体Employee
:
@Entity
public class EmployeeEntity{
@Id
private Long id;
private String username;
private String password;
private List<AddressEntity> addresses;
private DepartmentEntity department;
}
现在假设已经创建了一些AddressEntity
和DepartmentEntity
,所以我只想指出它。控制器看起来像这样:
@RestController
public class EmployeeController{
@Autowired
private EmployeeService;
@PostMapping
public EmployeeDto createEmployee(@RequestBody EmployeeDto employee){
return employeeService.createEmployee(employee);
}
}
和DTO:
public class EmployeeDto{
private Long id;
private String username;
private String password;
private List<AddressDto> addresses;
// private List<Long> addressesIds;
private DepartmentDto department;
// private Long departmentId;
}
所以困扰我的是如何正确地将数据从请求传输到服务层并进行响应。
创建新实体是首要问题,但如何更新?如果我只想更新Employee
用户名,那么我不应该传递所有其余的对象,那么ID可能是?它应该是仅具有可更新字段的自定义UpdateEmployeeRequest
还是具有password
之类的所有数据的DTO?
对不起,如果我弄乱了一点。太多的新知识了,我觉得自己像雾中的小孩一样转转……
答案 0 :(得分:2)
DTO应该像实体一样是对象1:1吗?或带有其他值(例如其他相关对象的ID)?
不是必需的。 DTO主要是将数据传递到视图层。您可以包装来自多个实体的数据并发送一个DTO进行查看。
还是DTO仅仅是概念,我还可以在每种场合使用自定义请求/响应吗?这会很方便,但是应该这样做吗?会有大量的单用例类。
是的。就像每种情况下的自定义请求/响应(从视图到视图的数据传输)。
创建新实体是首要问题,但如何更新?如果我只想更新Employee用户名,我不应该传递其余所有对象,那么ID可能是?它应该是仅具有可更新字段的自定义UpdateEmployeeRequest还是具有诸如密码之类的所有数据的DTO?
传递必需的最小字段,并在“创建/更新”上使用相同的DTO(带有ID的字段在更新时更新,而“创建”上的其他字段则更新)。
用于创建的示例dto:
username : "some user",
password : "some password",
... other fields
用于更新用户名的示例JSON:
id: 1,
username : "some user",