Dados nao sao persistidos corretamente (Resolvido)

4 respostas Resolvido
javahibernate
rodrigosnantes

Galera, estou com dificuldade para persistir uns valores de tabelas relacionadas.

Preciso pegar os valores digitados na tela e salvar no banco, tenho duas tabelas (Cliente e Veiculo) mapeadas pelo Hibernate.
Entretanto quando persisto os valores no banco, ele só esta salvando os valores relacionados a tabela Cliente, porem o vinculo relacionado é preenchido normalmente no banco, so que sem as informacoes pertinentes ao veiculo.

(Cliente)
    @OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL)
        public List<Veiculo> getVeiculo() {
            return veiculo;
        }

        public void setVeiculo(List<Veiculo> veiculo) {
            this.veiculo = veiculo;
        }

(Veiculo)
      @ManyToOne
        public Cliente getCliente() {
            return cliente;
        }
       public void setCliente(Cliente cliente) {
            this.cliente = cliente;
        }

Na minha tela eu pego os valores.

//pego os valores digitados na tela
    String tipo = String.valueOf(fildTipo.getSelectedItem());
    String cpf = fildCpf.getText();.....

    //envio pelo contrutor criado na classe model
    Cliente client = new Cliente(tipoPessoa.PESSOA_FISICA, cpf, rg, rgOrgao, rgUf,
            dataExpedicao, nome, cnh, municiopio, uf);

    String placa = fildPlacaUf.getText();
    String modelo = fildModeloCarro.getText();.....

    Veiculo veic = new Veiculo(placa, placa, dataCadastro, renvam, chassi, client);

     //chama o metodo de salvar
    ClienteController cli = new ClienteController();
    cli.salvarCliente(client);

Aqui minha classe controller, com meu metodo de salvar

public void salvarCliente(Cliente cliente) {
        
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();
        
        Transaction trx = session.beginTransaction();

        //instancio a classe de cliente e digo que esse veiculo tem um cliente
        Veiculo veiculo = new Veiculo();
        veiculo.setCliente(cliente);

        //agora digo que esse cliente tem um veiculo ou uma lista desse.
        cliente.getVeiculo().add(veiculo);
        
        session.persist(cliente);
        
        JOptionPane.showMessageDialog(null, "Dados foi salvo com sucesso");
        trx.commit();
        
        session.flush();
        
        session.close();
    }

Uma vez os dados salvos, verifico a tabela cliente e tenho isso.


e na tabela veiculo que deveria ter as informações do carro, tenho apenas o vinculo da tabela cliente, porem sem os dados.
image
Poderiam me ajudar?? Se precisarem de alguma informação é só falar.

att;

4 Respostas

javaflex

Só está setando o cliente.

rodrigosnantes

Obrigado por me ajudar,

uma duvida… quando eu digo @OneToMany(mappedBy = “cliente”, cascade = CascadeType.ALL) la na minha classe modeloCliente, ele nao deveria salvar o veiculo que inclui na lista?

Como eu deveria fazer nesse caso para que u consiga persistir o veiculo tbm?

namor
Solucao aceita

Rodrigo.

Neste trecho:

Veiculo veiculo = new Veiculo();
veiculo.setCliente(cliente);

//agora digo que esse cliente tem um veiculo ou uma lista desse.
cliente.getVeiculo().add(veiculo);

session.persist(cliente);

Veículo está vazio, vc deu new Veiculo() e pronto, não setou nada além do cliente (que no BD vira cliente_id), antes de salvar vc tem que colocar as propriedades que vc quer salvar do veículo.

Algo assim:

Veiculo veiculo = new Veiculo();

veiculo.setCliente(cliente);

veiculo.setChassi(123);

veiculo.setMarca(WV);
//agora digo que esse cliente tem um veiculo ou uma lista desse.
cliente.getVeiculo().add(veiculo);

session.persist(cliente);

Att,

rodrigosnantes
public void salvarCliente(Cliente cliente, Veiculo veiculo) {

        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();

        Transaction trx = session.beginTransaction();

        //instancio a classe de cliente e digo que esse veiculo tem um client
        veiculo.setCliente(cliente);
        veiculo.setChassi(veiculo.getChassi());
        veiculo.setDataCadastro(veiculo.getDataCadastro());
        veiculo.setMarca(veiculo.getMarca());
        veiculo.setPlaca(veiculo.getPlaca());
        veiculo.setRenavam(veiculo.getRenavam());

        //agora digo que esse cliente tem um veiculo ou uma lista desse.
        cliente.getVeiculo().add(veiculo);

        session.persist(cliente);

        JOptionPane.showMessageDialog(null, "Dados foi salvo com sucesso");
        trx.commit();

        session.flush();

        session.close();
    }

Fiz dessa forma, deu certo Namor, Muito obrigado mano!

Criado 19 de setembro de 2018
Ultima resposta 19 de set. de 2018
Respostas 4
Participantes 3