Hibernate Não Grava Id do Pai na Entidade Filha

Boa noite pessoal.

Estou com um problema num projetinho que estou fazendo em Java usado Hibernate.

Tenho a entidade pai Time que possui uma lista de jogadores:

@Entity
public class Time {

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

    @Column(name = "nome_time")
    private String nomeTime;

    @OneToMany(mappedBy = "time", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Jogador> jogadores = new ArrayList<>();

.......... Getters e Setters

E a entidade filha Jogador:

@Entity
public class Jogador {

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore
    private Time time;

    @Column(name = "nome_jogador")
    private String nomeJogador;

......... Getters e Setters

Acontece que ao fazer a gravação no banco ele não está colocando o id do pai (campo time_id) na tabela dos jogadores, está ficando NULL.

O meu service está assim:

public Time novoTime(TimeFormulario timeFormulario) {
        Time time = new Time();
        time.setNomeTime(timeFormulario.getNomeTime());

        List<Jogador> jogadores = new ArrayList<>();

        for (JogadorTimeFormulario jogadorForm : timeFormulario.getJogadores()) {
            Jogador jogador = new Jogador();
            jogador.setNomeJogador(jogadorForm.getNomeJogador);            
            jogadores.add(jogador);
        }
        time.setJogadores(jogadores ;

        final Time timeCriado = timeRepository.salvarTime(time);

        return timeCriado;
    }

E o TimeRepository:

@Transactional
    public Time salvarTime(Time time) {
        entityManager.persist(time);
        return time;
    }

Já procurei em tudo que é canto e nada resolve. Mesmo assim pode ser que já tenha um tópico aqui com este erro, porém não achei, mas caso tenha já peço desculpas.

Vc tem que setar a referencia do Time para cada Jogador no for para que o ID seja atribuido:

for (JogadorTimeFormulario jogadorForm : timeFormulario.getJogadores()) {
  Jogador jogador = new Jogador();
  jogador.setNomeJogador(jogadorForm.getNomeJogador());
  jogador.setTime(time); // com essa linha, o ID será atribuido corretamente ao salvar
  jogadores.add(jogador);
}

No seu caso, se um jogador não puder existir sem um time, vc também pode criar um construtor que já receba um Time. Assim deixa mais claro a relação entre essas entidades:

for (JogadorTimeFormulario jogadorForm : timeFormulario.getJogadores()) {
  Jogador jogador = new Jogador(time);
  jogador.setNomeJogador(jogadorForm.getNomeJogador());
  jogadores.add(jogador);
}

Assim, não será possível criar um jogador sem que um time não seja informado.

1 curtida

Mais simples do que imaginei, hahahaha. Valeu amigo.