Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dificuldade para fazer POST usando FORM quando existe relacionamento OneToMany

Olá. Estou com dificuldade para montar a lógica/estrutura usando FORM (DTO) quando tenho um relacionamento OneToMany (Pessoa com N Telefones, por exemplo). Poderiam me indicar algum material que esclareça melhor isso ?

private String nome;
private Integer idade;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pessoa")
private List<Telefone> telefones = new ArrayList<Telefone>();

Obrigado.

6 respostas

Oi Valdinei

No curso de JPA tem uma explicação sobre relacionamentos, acredito que possa te ajudar: https://cursos.alura.com.br/course/jpa-hibernate-persistencia-objetos/task/71531

Olá Otávio. Minha dificuldade está na estrutura do DTO, que para dados de entrada (POST) chamamos de FORM no curso. Queria saber como fazemos quando tem um relacionamento OneToMany. Preciso criar um FORM para classe Telefone? E como faço para montar o objeto que vou inserir/salvar no Repository. Consigo salvar só o objeto Pessoa que o Telefone vai junto? Ou preciso criar a Pessoa separado e depois inserir os Telefones. Resumindo, seria uma dúvida em relação ao fluxo usado para fazer o POST.

Valdinei,

Dá pra fazer assim:

public class TelefoneForm {

    private String ddd;
    private String numero;

    public Telefone coverter() {
        return new Telefone(ddd, numero);
    }

    //metodos get/set
}
public class PessoaForm {

    private String nome;
    private Integer idade;
    private List<TelefoneForm> telefones = new ArrayList<>();

    public Pessoa converter() {
        List<Telefone> telefones = this.telefones.stream().map(Telefone::converter).collect(Collectors.toList());
        return new Pessoa(nome, idade, telefones);
    }

    //metodos get/set
}
@Entity
public class Pessoa {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private Integer idade;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "pessoa", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Telefone> telefones = new ArrayList<Telefone>();

    //JPA exige um construtor default
    public Pessoa() {
    }

    public Pessoa(String nome, Integer idade, List<Telefone> telefones) {
        this.nome = nome;
        this.idade = idade;

        //relacionamento bidirecional
        telefones.forEach(t -> t.setPessoa(this));
        this.telefones.addAll(telefones);
    }
}

Bons estudos!

Show Rodrigo. Obrigado. Só descobri um probleminha de interpretação minha na hora que fui fazer os testes. No banco de dados a tabela Pessoa não conhece a tabela Telefone. Só existe uma chave estrangeira na tabela Telefone apontando para Pessoa. Nesse caso o relacionamento correto é de Telefone para Pessoa (ManyToOne) e acabei modelando só o OneToMany em Pessoa. Você podeira me dar uma dica no que muda nesse caso de colocar ManyToOne em Telefone ?

solução!

Na classe telefone precisa estar assim então:

@Entity
public class Telefone {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String ddd;
    private String numero;

    @ManyToOne
    private Pessoa pessoa;

    //gets e sets
}

Perfeito. Obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software