Erro ao salvar em relacionamento One to many

estou tentando fazer um save em um relacionamento @onetomany e ocorre o erro java.lang.NullPointerException


 ProjetoDAO proj = new ProjetoDAO();     
        PessoaFisicaDAO pfdao = new PessoaFisicaDAO();        
        BairroDAO bdao = new BairroDAO();
        
        Bairro  bairro = new Bairro();
        bairro = (Bairro) (bdao.getBairro(2));
        
        Projeto projeto = new Projeto();
        projeto.setInstituicao("instituicao");
        projeto.setTitulo("titulo");
        projeto.setPublico("publico");
        
        
        
        PessoaFisica pf = new PessoaFisica(new Pessoa());
        pf.setCpf("000.000.000-55");
        pf.setNis("33333333333");
        pf.setRg("22222222222");
        
        pf.getPessoa().setEndereco("2342424242");
        pf.getPessoa().setNome("jj");
        pf.getPessoa().setNumero(222);
        pf.getPessoa().setTelefone("334234234");
        pf.getPessoa().setTipopessoa("2");
        pf.getPessoa().setBairro(bairro);           
       
       
         projeto.setPessoa(pf.getPessoa());
       [b] pf.getPessoa().getProjetos().add(projeto); // java.lang.NullPointerException neste ponto[/b]
        
        proj.saveProjeto(projeto);
        pfdao.savePessoaFisica(pf);

oi,

O seu objeto Pessoa Fisica para estes dados possui projetos?

projetos possui pessoa

pessoa fisica possui pessoa

melhor, pessoa fisica possui pessoa e pessoa possui uma lista de projetos

pf.getPessoa().getProjetos().add(projeto)

Debuga a linha acima,

pf.getPessoa().getProjetos()

deve estar retornando nulo, ai você chama o método add e irá lançar aquela exception

abs

sim, é essa a linha em questTão que está com o erro , tem alguma outra forma de adicionar para que nao ocorra a exception ?

eu to tentando fazer eum um unico save ja incluir os dados , acho que não será possivel

Tenta Fazer isso olha


  projeto.setPessoa(pf.getPessoa());  
  pf.getPessoa().setProjetos(new List<Projetos>()); // caso nao for uma lista faça um new no objeto que for projetos
  pf.getPessoa().getProjetos().add(projeto); 

[quote=daniesouza]Tenta Fazer isso olha

[code]

projeto.setPessoa(pf.getPessoa());
pf.getPessoa().setProjetos(new List()); // caso nao for uma lista faça um new no objeto que for projetos
pf.getPessoa().getProjetos().add(projeto);

[/code][/quote]
é uma Lista, como salvo desse jeito resolveu em partes , agora nao dá erro mais , adiciona na lista , mas de 1 em 1 , masmo que insira 10 na lista só é salvo no banco o primeiro

você está fazendo new toda hora ou então só quando a lista não vem preenchida conforme o colega colocou acima??

[quote=tenclar][quote=daniesouza]Tenta Fazer isso olha

[code]

projeto.setPessoa(pf.getPessoa());
pf.getPessoa().setProjetos(new List()); // caso nao for uma lista faça um new no objeto que for projetos
pf.getPessoa().getProjetos().add(projeto);

[/code][/quote]
é uma Lista, como salvo desse jeito resolveu em partes , agora nao dá erro mais , adiciona na lista , mas de 1 em 1 , masmo que insira 10 na lista só é salvo no banco o primeiro[/quote]

cara… o new vc só faz uma vez… imagine que dentro de pessoa tenha uma lista de projetos… só que esta lista nao esta inicializada…

por isso vc precisa inicializar(new) na lista para poder adicionar os objetos…

se vc faz um new novamente ele esta realocando os objetos em memoria e os projetos que tinham na lista somem…

um outro modo de resolver estre problema e inicializar a lista direto na classe entidade(Pessoa)

List<Projetos> projetos = new ArrayList<Projetos>();

dai vc pode fazer direto pf.getPessoa().getProjetos().add(projeto);

verifiquei que somente utilizar pfdao.savePessoaFisica(pf); após utilizar as correções sujeridas não salva a lista somente depois de utilizar a classe dao do projeto

ProjetoDAO projdao = new ProjetoDAO();
projdao.save(projeto);

foi ai que descobri pq nao estava salvando toda a lista ,
fiz o seguinte código para que salvasse tudo :

PessoaFisicaDAO pedao = new PessoaFisicaDAO();        
        pedao.savePessoaFisica(pfisica);

        ProjetoDAO proj = new ProjetoDAO();
        for (Projeto pro : pfisica.getPessoa().getProjetos()) {
             proj.saveProjeto(pro);
            }

mas para mim deveria salvar somente chamando o dao pessoa fisica que salvaria em cascata , pois está definido isso na entidade …

[quote=tenclar]verifiquei que somente utilizar pfdao.savePessoaFisica(pf); após utilizar as correções sujeridas não salva a lista somente depois de utilizar a classe dao do projeto

ProjetoDAO projdao = new ProjetoDAO();
projdao.save(projeto);

foi ai que descobri pq nao estava salvando toda a lista ,
fiz o seguinte código para que salvasse tudo :

PessoaFisicaDAO pedao = new PessoaFisicaDAO();        
        pedao.savePessoaFisica(pfisica);

        ProjetoDAO proj = new ProjetoDAO();
        for (Projeto pro : pfisica.getPessoa().getProjetos()) {
             proj.saveProjeto(pro);
            }

mas para mim deveria salvar somente chamando o dao pessoa fisica que salvaria em cascata , pois está definido isso na entidade …
[/quote]

Entao… posta as suas classes de entidade para darmos uma olhada… esse jeito que vc fez funciona mas nao e o “correto”… o certo e acontecer como vc falou… deve ter alguma coisa errada nos relacionamentos…

segue os codigos:


/*
 *@tenclar Valus
 *
 */
package br.ac.gov.sepn.model;

import java.io.Serializable;
import java.util.ArrayList;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import java.util.List;
import javax.persistence.OneToMany;

/**
 *
 * @author tenclar
 */
@Entity
@Table(name="pessoas")
public class Pessoa implements Serializable{
    
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Integer id;
    private String nome;
    private String endereco;
    private int numero;
    private String tipopessoa;
    private String telefone;
    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name="bairros_id")
    private Bairro bairro;
     @OneToMany(cascade= CascadeType.MERGE,mappedBy="pessoa",fetch=FetchType.EAGER)
    private List<Projeto> projetos;

     
     
    public List<Projeto> getProjetos() {
        return projetos;
    }

    public void setProjetos(List<Projeto> projetos) {
        this.projetos = projetos;
    }
    
     

    

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getTipopessoa() {
        return tipopessoa;
    }

    public void setTipopessoa(String tipopessoa) {
        this.tipopessoa = tipopessoa;
    }
 
    
    
}

@Entity
@Table(name="pessoafisica")
public class PessoaFisica implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue
    private Integer id;
    private String rg;
    private String cpf;
    private String nis;
    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name="pessoas_id")
    private Pessoa pessoa;

    public PessoaFisica() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    
    
    
    public PessoaFisica(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
    
   

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNis() {
        return nis;
    }

    public void setNis(String nis) {
        this.nis = nis;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }
    
    

    
    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

   
    
    
}


    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Integer id;
    private String titulo;
    private String publico;
    private String objeto;
    private String instituicao;
    @Temporal(TemporalType.DATE) 
    private Date datainicio;
    @Temporal(TemporalType.DATE) 
    private Date datatermino;
    @ManyToOne(cascade = CascadeType.MERGE,fetch= FetchType.EAGER)
    @JoinColumn(name="pessoas_id")
    private Pessoa pessoa;

    public Projeto() {
    }

    public Projeto(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
    
    
    
    

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    
    
    public Date getDatainicio() {
        return datainicio;
    }

    public void setDatainicio(Date datainicio) {
        this.datainicio = datainicio;
    }

    public Date getDatatermino() {
        return datatermino;
    }

    public void setDatatermino(Date datatermino) {
        this.datatermino = datatermino;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getInstituicao() {
        return instituicao;
    }

    public void setInstituicao(String instituicao) {
        this.instituicao = instituicao;
    }

    public String getObjeto() {
        return objeto;
    }

    public void setObjeto(String objeto) {
        this.objeto = objeto;
    }

    public String getPublico() {
        return publico;
    }

    public void setPublico(String publico) {
        this.publico = publico;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

   
    
    
    
}


na classe PessoaFisica eu alterei no relacionamento @ManyToOne(cascade = CascadeType.MERGE) para CAscadeType.ALL , agora adiciona, mas não salva a exclusão.

[quote=tenclar]na classe PessoaFisica eu alterei no relacionamento @ManyToOne(cascade = CascadeType.MERGE) para CAscadeType.ALL , agora adiciona, mas não salva a exclusão.
[/quote]

da uma olhada neste meu exemplo… tenho as entidades Pessoa e Endereço… fica assim 1 Pessoa Possui N Endereços


@Entity
@Table(name = "pessoa")
public class Pessoa implements Serializable {

    @OneToMany(mappedBy = "idPessoa",cascade= CascadeType.ALL)
    private Collection<Endereco> enderecoCollection;
}

Agora tenho a classe Endereço


@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {
    private static final long serialVersionUID = 1L;

    @JoinColumn(name = "IdPessoa", referencedColumnName = "Id")
    @ManyToOne
    private Pessoa idPessoa;
}

Tenta Fazer Parecido com este e veja se dá certo…

acompanhando o retorno sql do hibernate , só está disparando update na lista de projetos , não exclui itens da lista , só adiciona.
acho que terei de fazer uma gambiz.

Adicionar na lista está fuuncionando mas remover não.

pf.getPessoa().getProjetos().remove(projeto);
   pfdao.savePessoaFisica(pf); 

o Dao está assim:

 protected void saveOrUpdate(Serializable pojo) {
        Session ses = getSession();
        ses.saveOrUpdate(pojo);
        ses.getTransaction().commit();
        ses.close();
    }

ola , ninguem !

f

Tenclar,

Posta seu método de exclusão.

será que é possivel fazer isso

para adicionar no banco de dados

 projeto.setPessoa(pf.getPessoa());    
 pf.getPessoa().setProjetos(new List<Projetos>());   
 pf.getPessoa().getProjetos().add(projeto);  
 pfdao.savePessoaFisica(pf); 

e para remover mas assim nao funciona

pf.getPessoa().getProjetos().remove(projeto);  
pfdao.savePessoaFisica(pf); 

acabo fazendo assim

pf.getPessoa().getProjetos().remove(projeto);  
pfdao.savePessoaFisica(pf); 
projetodao.remove(projeto); // mas  tem como nao ter de usar essa linha ?