Professional Documents
Culture Documents
Buscar
(9) (0)
QuandosetratadeheranaoHibernatetratadesteassuntomuitobemecomeficcia,digasedepassagem.Ocorrequenohapenas1
mtodopararealizaraHeranadeclassesnoHibernate,oqueconfundeamaioriadosdesenvolvedores.Antesdedarincioimportante
salientarqueousoinapropriadodeherananoHibernatepodecausarumalentidoincalculvelnasuaaplicao,porissopensesea
melhoralternativacomposioouherana.
Enfim,nossofoconomostrarseomelhorcomposioouherana,massimasformasdeseimplementarumaherananoHibernate.
Estasformasso3:
TabelanicaporHierarquiadeClasses
TabelaporSubclasse
TabelaporClasseConcreta
Cadaumadessastemsuapeculiaridade,enopodemossimplesmentedizer:AsoluoXmelhorqueY,poisissodependedeinmeras
variveis,taiscomo:suasregrasdenegcio.
PessoacomoSuperclasse,eoutras2classesPessoaFisicaePessoaJuridicaestendendodePessoa,oHibernateirgerarapenas1tabela
PessoacomosdadosdePessoa+PessoaFisica+PessoaJuridica.
EcomofeitaadivisodequemPessoaFsicaequemPessoaJurdica?Atravsdeumatributochamadodiscriminator.Noseu
tabelodeverterumcampoquefaaadiscriminaoentrePessoaFisica(F)ePessoaJuridica(J).Vejaabaixonalistagem1a
implementaodaclassePessoa.
Listagem1:mplementaodaClassePessoa
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tipo",length=1,discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("P")
publicclassPessoaimplementsSerializable{
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 1/10
05/02/2017 TiposdeHerancanoHibernate
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
privateLongidPessoa;
privateStringnome;
@Column(insertable=false,updatable=false)
privateStringtipo;
//gettersandsettersomitidos
}
Oquevainosimportarnocdigoacimaso3linhas:
1.@Inheritance(strategy=InheritanceType.SINGLE_TABLE):Identificaqueaestratgiadeheranaserdeumanicatabela,ouse
preferir,umtabeloparatudo.
2.@DiscriminatorColumn(name="tipo",length=1,discriminatorType=DiscriminatorType.STRING):Identificaqueocampoque
armazenarodiscriminatorotipo,detamanho1,dotipoString.
3.@DiscriminatorValue("P"):IdentificaqueaClassePessoaseridentificacomoatributoPnatabelaPessoa,ouseja,ondetiverP
porqueaqueleregistroumapessoa.
Vamosveragoranalistagem2aimplementaodapessoafsica:
Listagem2:ImplementaodaPessoaFsica
@Entity
@DiscriminatorValue(value="F")
publicclassPessoaFisicaextendsPessoa{
privateStringcpf;
//gettersandsettersomitidos
}
Bemsimples,oquenosinteressasaberqueseuDiscriminatorValueF,ouseja,ondetiverumFnocampotipodatabela,significaque
umaPessoaFsica.
Listagem3:ImplementaodaPessoaJurdica
@Entity
@DiscriminatorValue(value="J")
publicclassPessoaJuridicaextendsPessoa{
privateStringcnpj;
//gettersandsettersomitidos
}
Dispensaexplicaes,masimportanteserredundanteparafixaodocontedo.OndetiverovalorJnocampotipo,significaqueuma
PessoaJurdica.
Nafigura1,vejaqualseroresultadodatabela:
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 2/10
05/02/2017 TiposdeHerancanoHibernate
Figura1:TabelanicaporHierarquiadeClasses
filhasteremosumachaveestrangeiraqueapontarparaaclassepai.
Isto,setivermos1ClassePessoacom5atributos,1ClassePessoaFsicacom10atributose1ClassePessoaJurdicacom15atributos,
ogeradoser:1tabelapessoacom5atributos,1tabelapessoa_fisicacom10atributose1tabelapessoa_juridicacom15atributos.Vamos
aexemplos.
Listagem4:ImplementaodaPessoa
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
publicclassPessoaimplementsSerializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
privateLongidPessoa;
privateStringnome;
//gettersandsettersomitidos
}
Alinhaquenosinteressaaqui:
@Inheritance(strategy=InheritanceType.JOINED):IdentificaqueaestratgiadeheranaserJOINED,ouseja,serfeitaumajuno
atravsdechavesestrangeiras.
Listagem5.ImplementaoPessoaFisica
@Entity
@PrimaryKeyJoinColumn(name="idPessoa")
publicclassPessoaFisicaextendsPessoa{
privateStringcpf;
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 3/10
05/02/2017 TiposdeHerancanoHibernate
//gettersandsettersomitidos
}
Alinhaimportanteaqui:
@PrimaryKeyJoinColumn(name="idPessoa"):Identificaqualcampofaressajunoentreatabelapessoa_fisicaeatabelapessoa.
Listagem6:ImplementaoPessoaJuridica
@Entity
@PrimaryKeyJoinColumn(name="idPessoa")
publicclassPessoaJuridicaextendsPessoa{
privateStringcnpj;
//gettersandsettersomitidos
}
EstecdigoacimasegueamesmalgicadaListagem5,acolunaidPessoafazajunoentreatabelapessoaeatabelapessoa_juridica.
Vejacomoficouastabelasgeradas.
Figura2:TabelaporSubclasse
apenaspessoaFisicaepessoaJuridicacriarotabelas,issoporquepessoaumaclasseabstrata.
Receba notificaes :)
Listagem7:ImplementaodePessoa
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
publicabstractclassPessoaimplementsSerializable{
@Id
privateLongidPessoa;
privateStringnome;
//gettersandsettersomitidos
}
AnossaestratgiaagoraTABLE_PER_CLASS,queidentificaqueapenasasclassesconcretasserogeradas.
Listagem8:ImplementaoPessoaFisica
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 4/10
05/02/2017 TiposdeHerancanoHibernate
@Entity
publicclassPessoaFisicaextendsPessoa{
privateStringcpf;
//gettersandsettersomitidos
}
NadadediferenteaquijqueaestratgiaTABLE_PER_CLASS.
Listagem9:ImplementaoPessoaJuridica
@Entity
publicclassPessoaJuridicaextendsPessoa{
Guia Hibernate +
privateStringcnpj;
//gettersandsettersomitidos
}
Aindanadadenovo.Enfim,oresultadodasuatabelaservistonafigura3:
Figura3:TabelaporClasseConcreta
CONCLUSO
Vimosnesteartigo3tiposdeestratgiadeherananoHibernate:SINGLE_TABLE,JOINEDeTABLE_PER_CLASS.Cadaumcomsua
peculiaridadeeseusprsecontras.difcildefinirqualomelhor,poisnohmelhor,omelhorvocsaberdefinirquandousarcadaum
destes.
PublicadonoCanalJava
Receba notificaes :)
porRonaldoLanhellas
ExpertemJavaeprogramaoWeb
Compartilhe:
Ficoucomalgumadvida?
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 5/10
05/02/2017 TiposdeHerancanoHibernate
Posteaquisuadvidaoucomentrioquenossaequiperesponderomaisrpidopossvel.
CentralLtda
Comoconsigodarumgetdeumaclasseque"temuma"superclasseSINGLE_TABLE?
MinhaclassequeherdadasuperclasseSINGLE_TABLEfuncionaocrudnormalmente.
Minhaclassequetemum@ManytoOneparaasuperclassesalve,masnorecuperaoregistropornoencontraracoluna_id(superclasse).
Algumjimplementoualgoassim?
h+1ms
Douglas
OpaCentralltda,blz?
Acionamosoconsultoreestamostrabalhandonasuadvida.
Guia Hibernate
Nosepreocupe,poisvamostrazerumarespostaemat24horas. +
Umforteabrao.
h+1ms
Douglas
CentralLtda,tranquilo?
Emcontatocomoautor,elepediuparaquevocfaaapostagemdocdigoaquinopost.Destaforma,ficamaisfcildeteajudar.
Ficamosnoaguardo.
Umabrao.
h+1ms
Adicionarumcomentrio...
MatheusMunareto
Ol,estouutilizandoestaestrutura"tabelo",pormmevemumquestionamento.Estaprticanoeficazquandoseutilizaannotations
nullableeuniquecerto?Porquetodavezqueeuinserirnobancoumpessoafsicaporexemplo,osatributosCNPJficaronull,ocasionandoem
errodevidoaannotationnullable=falsequeconstanaclasse,nocasoestprticanopermitequetenhamcampos"nonullos"correto?
h+1ms
Douglas
FalaMatheus,blz?
Acionamosoconsultoreestamostrabalhandonasuadvida.
Nosepreocupe,poisemat24horasvamostrazerumaresposta.
Umforteabrao.
h+1ms
MatheusMunareto
Estounoaguardo.
Receba notificaes :)
h+1ms
Douglas
Matheus,
Noesquecemosdevoc!
Aindaestamostrabalhandonasuadvida.
Peolhequeaguardesmaisumpouco.
Umforteabrao.
h+1ms
[autor]RonaldoLanhellas
OlMatheus,aestruturaSINGLE_TABLEtemessesproblemasquevoccitou.Dependemuitodoseunegcioescolheroseuusoouno.
Eu,pessoalmente,recomendariaparaumaestruturadePessoa>PessoaFisicaePessoa>PessoaJuridicaousodoJOINED.
h+1ms
Adicionarumcomentrio...
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 6/10
05/02/2017 TiposdeHerancanoHibernate
Adicionarumcomentrio...
LuisEduardo
Eutenhoumaduvida,comoeumapeioassubclassesnohibernate.cfg.xml,nomeucasoeuopteiemusarotabelomasgostariadesaber
tambemdecomoficanosoutros2.
h+1ms
DouglasClaudio
OlLuis,obrigadopeloseucomentrio.
EnviamossuasolicitaoaoRonaldoeestamosnoaguardodeumfeedbackdomesmo.
Umabrao.
h+1ms
[autor]RonaldoLanhellas
Guia Hibernate +
Creioqueesselinkirlheajudar.VocencontrartodosostiposdeheranasemXML:
https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/inheritance.html#inheritancetableperclass
h+1ms
LuisEduardo
Obrigado,masjaconseguiresolveroproblema.
h+1ms
DouglasClaudio
OpaLuis,
Agradecemospelocomentrio.
Umabrao.
h+1ms
Adicionarumcomentrio...
SergioBruno
OiRonaldo,muitobomoartigo,noseisevocpodemeajudar,precisofazerumInheritanceType.JOINED,igualaodoseuexemplo,porma
minhatabelaPessoaJuridicaachaveprimrianooidPessoaesimumachavecompostade3colunas,pormelapossuiaforeignkey
idPessos,comopossomapearaclassePessoaJuridica?
atabelaPessoaJuridicaassim
Matricula
Corporacao
idPessoa
CNPJ
achaveprimriaMatricula+Corporacao
h+1ano
Receba notificaes :)
DouglasClaudio
OlSergio,obrigadopeloseucomentrio.
EnviamossuasolicitaoaoRonaldoeestamosnoaguardodeumfeedbackdomesmo.
Umabrao.
h+1ano
[autor]RonaldoLanhellas
VocdevemudarnomapeamentodaPessoaJuridicaparaaseguinteanotao:
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="matricula",referencedColumnName="matricula"),
@PrimaryKeyJoinColumn(name="corporacao",referencedColumnName="corporacao")
})
h+1ano
SergioBruno
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 7/10
05/02/2017 TiposdeHerancanoHibernate
OiRonaldo,obrigadopormeajudar,pormeumudooPrimaryKey,masachaveentrangeiraqueligaaPessoaTitularaPessoaaidPessoa,
oJPAvaisaberdissocomo?eunoestoumapeandooPessoaparapessoaTitular.
h+1ano
DouglasClaudio
OlSergio,obrigadopeloseucomentrio.
EnviamossuasolicitaoaoRonaldoeestamosnoaguardodeumfeedbackdomesmo.
Umabrao.
h+1ano
[autor]RonaldoLanhellas
Voctemquemudarorelacionamentonobancotambm.
Adicionarumcomentrio...
WilliamPalermo
Ok,meioantigooartigo..Masmeajudoumtohj.
Porem,fiqueicomumaduvidamaisconceitual,meiobestamas.........
aseguinte,nocasodousodoTABLE_PER_CLASS,porquenecessrioimplementaloemumaclasseabstrata??Seiquenecessriopq
foionicojeitoquefuncionouaqui,masgostariadeentenderoporque.??
Obrigado(mesalvours)
h+1ano
DouglasClaudio
OlWilliam,obrigadopeloseucomentrio.
EnviamossuasolicitaoaoRonaldoeestamosnoaguardodeumfeedbackdomesmo.
Umabrao.
h+1ano
[autor]RonaldoLanhellas
Sim,vocprecisacolocaraSuperClassecomoAbstratapoiselanoserimplementada,apenassuasfilhassero.Assimcomomostradono
exemploondeaclassePEssoaabstrata/genricaePessoaFisicaaconcreta.
h+1ano
Adicionarumcomentrio...
RodrigoAssuno
Foimuitotil.
Receba notificaes :)
Valeu
h+1ano
Adicionarumcomentrio...
RafaelMoreira
TenhoumaduvidacomHerana.
UtilizoCDIWeld,Primefaces3.5eJSF2.0comHibernate.
Tenhomumatabeladeusuriosquemappeeicomoautorelacionamento:
privatePermissaopermissao
privateUsuariochefe
privateEmpresaempresa
privateAreaarea
privateList<Usuario>subordinados=newArrayList<>()
noconversorcoloqueiparacadaumdostiposdeusurioseaosalvarotipodeusurioencarregadorecebonullquandofaoelecomo
transactionalparaatacharaobancoeantesdomtodotesteiepegooobjeto.
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 8/10
05/02/2017 TiposdeHerancanoHibernate
Segueocdigoextradoabaixo:
NomtododoBean:
publicvoidsalvar(){
System.out.println("NoSalvar:"+this.encarregado.getNome())
this.encarregado=cadastroEncarregadoService
.salvarEncarregado(this.encarregado)
limpar()
FacesUtil.addInfoMessage("Encarregadosalvocomsucesso!")
}
NaClassedeserviochamadaapsesta:
@Transactional
Guia Hibernate
publicUsuariosalvarEncarregado(Usuarioencarregado){ +
System.out.println("AntesdaBusca:"+encarregado.getCodigo())
>agoranestetrechoquerecebonull.
Qualseriaomotivodasequenciadocdigoestarvindonula?
h+1ano
DiogoSouza
OlRafael,
E ntendiasituao,masnodparaassimilaroproblemacompletosemvercomovocestrecuperandoobjeto"encarregado",umavezque,
pelousodothis,eledeveserumatributodeclasse.
Podenosmostrarcomoestfazendoisso...?
h+1ano
[autor]RonaldoLanhellas
Desculpeademorapararesponder,masvamosl.ComonossoamigoDiogodisse,difcildedizeroproblemaexatoapenascomtrechosde
cdigoquenoajudamnaresoluodeste.Pormvouusarumapoucodelgicaparadetectarseesteoproblema,vamosadoisprovveis
problemas:
1Imaginoqueoseucampo'codigo'dentrodaentidade'encarregado'geradoautomaticamentepelobanco(umsequence),evocest
tentandofazerum"encarregado.getCodigo()"antesdesalvaraentidadenobanco,seissoforverdade,entovocnoconseguirrecuperar
nadamesmopoisocampo'codigo'estarnuloatqueelesejasalvoegeradofisicamentenobancodedados.
2Casovocjtenhasalvosuaentidadenobancoemesmoassimocampo'codigo'(quepensoquesejaumasequence)aindaestejanulo,
entovejanobancosefoigeradomesmoessevalor,casocontrriodepureseucdigonomtodo"setCodigo()"evejaseeleestsendo
executadoequalvalorestsendopassado.
h+1ano
Adicionarumcomentrio...
LusSimas CONSULTOR
Receba notificaes :)
MuitobomLeonardo.Sinceramente,oHibernateoHibernatenomesmo?
Parabenspeladidtica.
ForteAbrao
h+1ano
[autor]RonaldoLanhellas
CaroLus,agradeopeloelogioeaproveitoparadizerqueRonaldoenoLeonardo.Enfim,obrigadopormimepeloLeonardoheheh.
h+1ano
Adicionarumcomentrio...
Maisposts
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 9/10
05/02/2017 TiposdeHerancanoHibernate
Microartigo
HospedagemwebporPorta80WebHosting
Receba notificaes :)
http://www.devmedia.com.br/tiposdeherancanohibernate/28641 10/10