创建与现有实体相关的新实体

时间:2020-05-23 12:55:55

标签: java spring spring-mvc

我正在尝试弄清楚如何正确执行此操作。假设我有这样的实体Employee

@Entity
public class EmployeeEntity{

   @Id
   private Long id;
   private String username;
   private String password;
   private List<AddressEntity> addresses;
   private DepartmentEntity department;

}

现在假设已经创建了一些AddressEntityDepartmentEntity,所以我只想指出它。控制器看起来像这样:

@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;
}

所以困扰我的是如何正确地将数据从请求传输到服务层并进行响应

  • DTO应该像实体一样是对象1:1吗?
  • 还是带有其他值,例如其他相关对象的ID?
  • 还是DTO只是概念,我还可以在每种场合使用自定义请求/响应吗?这会很方便,但是应该这样做吗?会有大量的单用例课程。

创建新实体是首要问题,但如何更新?如果我只想更新Employee用户名,那么我不应该传递所有其余的对象,那么ID可能是?它应该是仅具有可更新字段的自定义UpdateEmployeeRequest还是具有password之类的所有数据的DTO?

对不起,如果我弄乱了一点。太多的新知识了,我觉得自己像雾中的小孩一样转转……

1 个答案:

答案 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",