1
resposta

Duvida quanto à implementação Many To One

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?
1 resposta

Oi!

O problema é que no seu record DadosDetalhamentoFita você colocou um atributo List<Linha> linhas, mas linha é uma entidade e não deveria ser devolvido pela api.

Crie outro record para representar as linhas e altere esse atributo para ser um List desse record.

Por exemplo:

List<DadosDetalhamentoLinha> linhas