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