You are on page 1of 10

05/02/2017 TiposdeHerancanoHibernate

Buscar

favorito(5) marcarcomolido dvidas?

Tipos de Heranca no Hibernate


Veja neste artigo os tipos diferentes de herana que o Hibernate pode implementar.

(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.

Tabela nica por Hierarquia de Classes


Esteofamosotabelocommilharesdecampos,ondegerado1tabelaparatodaahierarquiadeclasses.SevoctiverumaClasse

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

Tabela por Subclasse


NessaestratgiansteremosaClassePaietodassuasfilhasgeradasnobancodedadosfisicamente,sendoqueemtodasasclasses

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

Tabela por Classe Concreta


Nomenosimportante,essaestratgiadefinequeapenasasclassesconcretasgeramsuasrespectivastabelas,ouseja,emnossoexemplo

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

Ajudenosaevoluir:vocgostoudopost? (9) (0)

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.

h+1ano Guia Hibernate +


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

Hibernate: Persistindo datas no Java sem incompatibilidade de tipos


Guia

Guia de Referncia Carreira Programador Web Java


Guia

Guia de Referncia Spring Framework


Guia

Guia de Referncia Hibernate


Guia

Guia de Referncia Frameworks Java Guia Hibernate +

Listar mais contedo

Publique | Assine | Faleconosco

HospedagemwebporPorta80WebHosting

Receba notificaes :)

http://www.devmedia.com.br/tiposdeherancanohibernate/28641 10/10

You might also like