Lucas referente a questão do endereço você faria da seguinte forma, no seu Record de endereço você criaria um construtor no seguinte exemplo:
public AddressObject (Address address){
this(address.getLogradouro(), address.getBairro(), address.getCep(),
address.getCidade(), address.getUf(), address.getComplemento(), address.getNumero());
}
eai por exemplo no método de cadastrar você passaria no ResponseEntity< Seu Record Aqui > e passaria uma instância de enderecoDTO no body que seria teu Record passando o objeto de persistência Endereco como parâmetro. Como mostrado no exemplo abaixo:
@PostMapping
@Transactional
public ResponseEntity<DoctorObject> saveDoctor(@RequestBody @Valid DoctorObject doctorObject, UriComponentsBuilder uriBuilder) {
Doctor doctor = this.doctorService.insertDoctor(doctorObject);
URI uri = uriBuilder.path("/doctor/{id}").buildAndExpand(doctor.getDoctorIdentifier()).toUri();
return ResponseEntity.created(uri).body(new DoctorObject(doctor));
}
como você pode notar no método acima temos uma conversão do Objeto de persistência Doctor para um DoctorDTO e invés de eu expor meu Objeto Doctor estou expondo o DTO, podendo assim, ter flexibilidade de mostrar os atributos que desejo e evitar assim ataques Mass Assignment