Herança Single Table

Java

25/01/2012

Eu tenho uma plicação onde cadastro de pessoa física e jurídica, neste caso eu tenho que instanciar as duas ?
Jose Boas

Jose Boas

Curtidas 0

Respostas

Davi Costa

Davi Costa

25/01/2012

Vão existir n modos de vc fazer isso.
Vc pode crir uma classe pai Pessoa, e as duas filhas extendendo de Pessoa(classe tal que terá apenas os campos comuns aos dois tipos de Pessoa) e os filhos PessoaFisica e PessoaJuridica herdaria os métodos e vc faria um bom uso da OO.
Ou criar uma Pessoa e nela teria um atributo que definiria se é PessoaFisica ou PessoaJuridica, mas caso tenha campos com características diferentes de um para o outro te daria problemas...
Melhor do meu ponto de vista é a primeira opção.

att Davi
GOSTEI 0
Jose Boas

Jose Boas

25/01/2012

Eu fiz isso criei pessoa e PessoaFisica e Juridica e extend. A miha dúvida é na hora do bean e o xhtml.
Eu vou cadastrar eu não sei se será física ou jurídica até o selecinar, mas daí no meu xhtml eu terei que colocar nos campos em comum a Pessoa e nos campos específicos PessoaJuridica ou/e Fisica .
Veja como eu fiz.

xhml
<h:inputHidden value=#{entidadeBean.selecionada.codigo}/>
<h:panelGrid columns=3 id=linha1>
<h:outputLabel value=Data for=data/>
<h:outputLabel value=Nome for=nome/>
<h:outputLabel value=Apelido for=apelido/>
<p:calendar id=data value=#{entidadeBean.selecionada.dataCadastro} mode=popup showOn=button popupIconOnly=true pattern=dd/MM/yyyy size=15/>
<p:inputText id=nome value=#{entidadeBean.selecionada.nome} required=true size=55 />
<p:inputText id=apelido value=#{entidadeBean.selecionada.apelido} required=true size=26 />
</h:panelGrid>
<h:panelGrid columns=3 id=linha2 rendered=#{entidadeBean.selecionada.tipoEntidade==1}>
<h:outputLabel value=CPF for=cpf/>
<h:outputLabel value=Rg for=rg/>
<h:outputText></h:outputText>
<p:inputMask id=cpf value=#{entidadeBean.selecionadaFisica.cpf} required=true size=18 mask=999.999.999-99 />
<p:inputText id=rg value=#{entidadeBean.selecionadaFisica.rg} required=true size=15/>
</h:panelGrid>
<h:panelGrid columns=3 id=linha3 rendered=#{entidadeBean.selecionada.tipoEntidade==2}>
<h:outputLabel value=CNPJ for=cnpj/>
<h:outputLabel value=Incrição Estadual for=inscricaoEstadual/>
<h:outputText></h:outputText>
<p:inputMask id=cnpj value=#{entidadeBean.selecionadaJuridica.cnpj} required=true size=18 mask=99.999.999/9999-99 />
<p:inputText id=inscricaoEstadual value=#{entidadeBean.selecionadaJuridica.inscricaoEstadual} required=true size=15/>
</h:panelGrid>
<h:panelGrid columns=3 id=linha4>
<h:outputLabel value=Endereço for=endereco/>
<h:outputLabel value=Nº for=numero/>
<h:outputLabel value=Cidade for=cidade/>
<p:inputText id=endereco value=#{entidadeBean.selecionada.endereco} required=true size=64/>
<p:inputText id=numero value=#{entidadeBean.selecionada.numero} size=6/>
<p:inputText id=cidade value=#{entidadeBean.selecionada.cidade} required=true size=29/>
</h:panelGrid>
<h:panelGrid columns=3 id=linha5>
<h:outputLabel value=Bairro for=bairro/>
<h:outputLabel value=Complemento for=complemento/>
<h:outputLabel value=CEP for=cep/>
<p:inputText id=bairro value=#{entidadeBean.selecionada.bairro} required=true size=25 />
<p:inputText id=complemento value=#{entidadeBean.selecionada.complemento} required=true size=10 />
<p:inputMask id=cep value=#{entidadeBean.selecionada.cep} required=true size=10 mask=99999-999/>
</h:panelGrid>
GOSTEI 0
Davi Costa

Davi Costa

25/01/2012

no seu bean e na sua página vc pode esconder e mostrar campos conforme sua regra de negócio,
vc separa os campos conforme o tipo de pessoa, se for de um tipo mostre seus campos, se for de outro mostre outros campos.
Ou então no bean vc verifica se objeto é de determinado tipo e no bean vc cria mais dois objeto, um pessoaFisicaSelecionada e um pessoaJuridicaSelecionada (cria getters e setters) e o objeto selecionada passa seu valor para a pessoa específica:

if(selecionada instanceOf PessoaFisica){
pessoaFisicaSelecionada = (PessoaFisica) selecionada;
}.....
e na sua página vc já coloca os campos para pessoa específica, por exemplo:
<p:inputText id=endereco value=#{entidadeBean.pessoaFisicaSelecionada.endereco} required=true size=64/>

só que em cima vc vai ter que usar o atributo rendered para vc se selecionada é PessoaFisica, talvez até te ajude criar um boolean global do seu Bean para tratar isso, se é PessoaFisica ele recebe true, se é PessoaJuridica recebe false, ai vc pega esse boolean e vai te ajudar bastante na página, ai vc o trta no bean do seguinte modo:

if(selecionada instanceOf PessoaFisica){
pessoaFisicaSelecionada = (PessoaFisica) selecionada;
auxTipoPessoa = true;
}else{
pessoaJuridicaSelecionada = (PessoaJuridica) selecionada;
auxTipoPessoa = false;
}

adapta para sua solução

att Davi
GOSTEI 0
Jose Boas

Jose Boas

25/01/2012

Entendi o que você quis dizer só me resto uma dúvida. No meu xhml eu terei que colocar um rendered em cada campo ou em um panel grid ?
Ex:
<h:panelGrid columns=3 id=linha3 rendered=#{entidadeBean.selecionada.tipoEntidade==2}>
<h:outputLabel value=Endereco for=endereco/>
<p:inputMask id=cnpj value=#{entidadeBean.selecionadaJuridica.endereco} required=true size=60/>
</h:panelGrid>

<h:panelGrid columns=3 id=linha3 rendered=#{entidadeBean.selecionada.tipoEntidade==1}>
<h:outputLabel value=Endereco for=endereco/>
<p:inputMask id=cnpj value=#{entidadeBean.selecionadaFisica.endereco} required=true size=60/>
</h:panelGrid>

Eu não sei se tem else no rendered, se tem não sei como fazer. Neste caso eu estou aplicando no panel grid, mas eu poderia aplicar em cada campo ?
GOSTEI 0
Jose Boas

Jose Boas

25/01/2012

Entendi o que você quis dizer só me resto uma dúvida. No meu xhml eu terei que colocar um rendered em cada campo ou em um panel grid ?
Ex:
<h:panelGrid columns=3 id=linha3 rendered=#{entidadeBean.selecionada.tipoEntidade==2}>
<h:outputLabel value=Endereco for=endereco/>
<p:inputMask id=cnpj value=#{entidadeBean.selecionadaJuridica.endereco} required=true size=60/>
</h:panelGrid>

<h:panelGrid columns=3 id=linha3 rendered=#{entidadeBean.selecionada.tipoEntidade==1}>
<h:outputLabel value=Endereco for=endereco/>
<p:inputMask id=cnpj value=#{entidadeBean.selecionadaFisica.endereco} required=true size=60/>
</h:panelGrid>

Eu não sei se tem else no rendered, se tem não sei como fazer. Neste caso eu estou aplicando no panel grid, mas eu poderia aplicar em cada campo ?

Da um olhada no meu xhtml.
<h:inputHidden value=#{entidadeBean.selecionada.codigo}/>
<h:panelGrid columns=3 id=linha1>
<h:outputLabel value=Data for=data/>
<h:outputLabel value=Nome for=nome/>
<h:outputLabel value=Apelido for=apelido/>
<p:calendar id=data value=#{entidadeBean.selecionada.dataCadastro} mode=popup showOn=button popupIconOnly=true pattern=dd/MM/yyyy size=15/>
<p:inputText id=nome value=#{entidadeBean.selecionada.nome} required=true size=55 />
<p:inputText id=apelido value=#{entidadeBean.selecionada.apelido} required=true size=26 />
</h:panelGrid>
<h:panelGrid columns=3 id=linha2 rendered=#{entidadeBean.selecionada.tipoEntidade==1}>
<h:outputLabel value=CPF for=cpf/>
<h:outputLabel value=Rg for=rg/>
<h:outputText></h:outputText>
<p:inputMask id=cpf value=#{entidadeBean.selecionadaFisica.cpf} required=true size=18 mask=999.999.999-99 />
<p:inputText id=rg value=#{entidadeBean.selecionadaFisica.rg} required=true size=15/>
</h:panelGrid>
<h:panelGrid columns=3 id=linha3 rendered=#{entidadeBean.selecionada.tipoEntidade==2}>
<h:outputLabel value=CNPJ for=cnpj/>
<h:outputLabel value=Incrição Estadual for=inscricaoEstadual/>
<h:outputText></h:outputText>
<p:inputMask id=cnpj value=#{entidadeBean.selecionadaJuridica.cnpj} required=true size=18 mask=99.999.999/9999-99 />
Nos campos em comum eu uso o da pessoa mesmo.
GOSTEI 0
Davi Costa

Davi Costa

25/01/2012

Pode ser em um pai sim, um panel.. e por ai vai..
Ai vc vai criar dois campos e rendered sempre vai ser um ao contrário do outro por isso sugeri um boolean pq ele nunca vai ser ao mesmo tempo true e false... um panel para true e um panel para false.
att Davi
GOSTEI 0
Jose Boas

Jose Boas

25/01/2012

Eu consegui fazer 1 para pessoa juridica e 2 para pessoa Física, mas estou com um problema quando eu clico no botao salvar
ele dá um rendered novamente e o que esta dentro<p:InputText> do panel group fica nulo . Eu queria quando salvar não da um rendered nos panelgroup .
GOSTEI 0
Dyego Carmo

Dyego Carmo

25/01/2012

Para conseguir isto voce vai precisar de AJAX só para reenderizar a area afetada :)
GOSTEI 0
POSTAR