Olá!
Estou utilizando a API construída nos cursos, VollMed, como referência para estudos. Estou tentando criar outros cenários de consultas e cadastros de acordo com o que foi aprendido. Ocorre que me deparei com uma situação que me deixou dúvida sobre se a estratégia q utilizei é realmente adequada.
Tenho duas entidades relacionadas
//Fita, que seria uma espécie de cabeçalho para informações que tenho armazenadas linha a linha.
@Table(name="FITAS") @Entity(name="Fita") @Getter @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of ="id") public class Fita {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long idAgencia;
private LocalDate dataMovimento;
private Long equipamento;
@Column(name = "matricula")
private String matriculaDoOperador;
private LocalDateTime dataAbertura;
private LocalDateTime dataFechamento;
public Fita(DadosCadastroFita dados) {
this.idAgencia = dados.idAgencia();
this.dataFechamento = dados.dataDoFechamento();
this.dataAbertura = dados.dataDaAbertura();
this.dataMovimento = dados.dataDoMovimento();
this.matriculaDoOperador = dados.matriculaDoOperador();
this.equipamento = dados.equipamento();
}
}
//Linha
@Table(name="LINHAS") @Entity(name="Linha") @Getter @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of ="id") public class Linha {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String mensagem;
@Column(name="dataTransacao")
private LocalDateTime data;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fita_id")
Fita fita;
public Linha(DadosCadastroLinha dados) {
this.data = dados.data();
this.mensagem = dados.mensagem();
}
}
A ideia é armazenar várias fitas, cada uma delas com seu próprio conjunto de linhas. Como uma Fita possui 1 ou várias linhas, a maneira mais adequada de armazenar que encontrei foi inserir uma chave estrangeira com o id da fita na tabela de linhas, e mapear o relacionamento como @ManyToOne na entidade Linha.
Porém, ao realizar a seguinte consulta:
public ResponseEntity Detalhar(Long id) { Fita fita = repository.findById(id).get(); List linhas = linhaRepository.findAllByFita_Id(id);
DadosDetalhamentoFita dadosDeRetorno = new DadosDetalhamentoFita(fita, linhas);
return ResponseEntity.ok(dadosDeRetorno);
}
public record DadosDetalhamentoFita(
Long id,
Long idAgencia,
LocalDate dataMovimento,
Long equipamento,
String matriculaDoOperador,
LocalDateTime dataAbertura,
LocalDateTime dataFechamento,
List<Linha> linhas) {
public DadosDetalhamentoFita(Fita fita, List<Linha> linhas){
this(fita.getId(), fita.getIdAgencia(), fita.getDataMovimento(), fita.getEquipamento(), fita.getMatriculaDoOperador(), fita.getDataAbertura(), fita.getDataFechamento(), linhas);
}
}
acabo trazendo informações duplicadas:
{
"id": 3,
"idAgencia": 11,
"dataMovimento": "2023-06-01",
"equipamento": 111,
"matriculaDoOperador": "1111111",
"dataAbertura": "2023-06-01T13:46:26",
"dataFechamento": "2023-06-01T16:44:26",
"linhas": [
{
"id": 23,
"mensagem": "------------------------------------------------",
"data": "2023-06-01T16:44:26",
"fita": {
"id": 3,
"idAgencia": 11,
"dataMovimento": "2023-06-01",
"equipamento": 111,
"matriculaDoOperador": "1111111",
"dataAbertura": "2023-06-01T13:46:26",
"dataFechamento": "2023-06-01T16:44:26"
}
},
A forma q utilizei estaria correta? tanto para o mapeamento quanto para a pesquisa q pretendia (no caso, pretendia ter um objeto com as informações da fita seguido de todas as linhas dessa fita). Caso não esteja, como eu poderia melhorar?