Problema NullPointer JSF [RESOLVIDO]

Oi pessoal,

tenho uma classe Pessoa que tem 3 tipos de Endereços: [code]@Entity
@Table(name=“pessoa”)
public class Pessoa implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="PESSOA_ID")
private Long id;

/**
 * ENDEREÇOS		
 */
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="end_res_id")
private EnderecoContato enderecoResidencial = new EnderecoContato();

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="end_com_id")
private EnderecoContato enderecoComercial = new EnderecoContato();

@OneToOne(cascade = CascadeType.ALL)  
@JoinColumn(name="end_cob_id")
private EnderecoContato enderecoCobranca = new EnderecoContato();

...

}[/code] Percebam que eu já inicializo as variávies EnderecoContato. Até aí tudo bem… o problema é que se o usuário só quiser preencher um dos endereços, os outros também serão gravados no banco com valores NULL.
Se eu tirar as inicializações new EnderecoContato(); eu recebo um erro de NULL no JSF.
Seguem os outros códigos:
MB: [code]public class PessoaFisicaFace {

private Pessoa pessoa = new Pessoa();

public String save(){
	Session session = HibernateUtil.currentSession();
	PessoaDAO dao = new PessoaDAO(session);
	pessoa.setTipoPessoa('F');

	dao.inserePessoa(this.pessoa);

	this.pessoa = new Pessoa(); 
	
	this.clean();
	return "toCadastraFisica";
}
...

}[/code]
DAO: [code]public class PessoaFisicaDAO {

private Session session;

private Logger logger = Logger.getLogger(PessoaFisicaDAO.class);

public PessoaFisicaDAO(Session session) {
	logger.info("Construtor" + session);
	this.session = session;
}

/**
 * @verifica salva novos dados no sistema
 */
public void inserePessoa(Pessoa pessoa) {
	session.saveOrUpdate(pessoa);
}[/code]

O correto seria tirar os new EnderecoContato(); e setar os endereços em outro lugar, mas onde?

Alguém pode ajudar?

oi.

tati.mat.moreira, talvez seria melhor vc não inicializar os endereços a na classe pessoa.

faça assim:

Pessoa p = new Pessoa(); EnderecoContato end = new EnderecoContato(); p.setEnderecoResidencial(end); dao.inserePessoa(p);

Vou tentar…

10ks

Deu certo, não.

Eu incializei os endereços nos gets da classe Pessoa: [code]public class Pessoa implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="PESSOA_ID")
private Long id;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="end_res_id")
private EnderecoContato enderecoResidencial;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="end_com_id")
private EnderecoContato enderecoComercial;

@OneToOne(cascade = CascadeType.ALL)  
@JoinColumn(name="end_cob_id")
private EnderecoContato enderecoCobranca;

@OneToOne(cascade = CascadeType.ALL)  
@JoinColumn(name="end_ent_id")
private EnderecoContato enderecoEntrega;

public EnderecoContato getEnderecoResidencial() {
	if(this.enderecoResidencial == null){
		this.enderecoResidencial = new EnderecoContato();
		return this.enderecoResidencial;
	}else{
		return this.enderecoResidencial;
	}
}

public void setEnderecoResidencial(EnderecoContato enderecoResidencial) {
	this.enderecoResidencial = enderecoResidencial;
}
...

}[/code]
Assim, funcionou. Há alguma implicação nisso?

Tati vc não pode inicializar diretamente na classe Pessoa e tão pouco nos gets e sets ( fica estranho )

O que eu sugiro :

Quando o usuário for criar um endereço vc faz


//Aqui estamos na classe do JSF

EnderecoContato endereco1 = new EnderecoContato();
EnderecoContato endereco2 = new EnderecoContato();
EnderecoContato endereco3 = new EnderecoContato();
Pessoa pessoa = new Pessoa();

//e antes de mandar salvar a pessoa vc faz

if(endereco1 != null){
pessoa.setEnderecoComercial(endereco1);
}

if(endereco2 != null){
pessoa.setEnderecoResidencial(endereco2);
}

//feito as validações na sua classe JSF vc salva

this.dao.save(pessoa);

os nomes são apenas para exemplificar…a diferença é que agora vc possue atributos do tipo endereço fora do seu entity do hibernate

Giulliano, funfou legal!

Obrigada!