Problema NullPointer JSF [RESOLVIDO]

5 respostas
tati.mat.moreira

Oi pessoal,

tenho uma classe Pessoa que tem 3 tipos de Endereços:
@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();
	
	...
}
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:
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";
	}
	...
}
DAO:
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);
	}

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

Alguém pode ajudar?

5 Respostas

P

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);

tati.mat.moreira

Vou tentar…

10ks

tati.mat.moreira

Deu certo, não.

Eu incializei os endereços nos gets da classe Pessoa:
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;
	}
	...
}
Assim, funcionou. Há alguma implicação nisso?
Giulliano

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

tati.mat.moreira

Giulliano, funfou legal!

Obrigada!

Criado 3 de março de 2009
Ultima resposta 4 de mar. de 2009
Respostas 5
Participantes 3