Sunteți pe pagina 1din 8

05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

Altieres de Matos

Aprendendoaprogramar

Implementando Herana comHibernate

Eaigaleratudobom?

DandoumtemponospostssobreCriteriacomHibernatevamosmudardetemaparadescontrair

Hoje o tema Herana com Hibernate, na qual vejo que muitas pessoas tem certa diculdade em
implementaresaberqualformautilizar.

Nosexemplosdestepostireiutilizarclassesbemsimples,umaparaopostnocarmuitocansativo
e outra para car de fcil entendimento. Em todos os exemplos irei utilizar o to famoso caso da
PessoaFsicaePessoaJurdicaquetemmuitosatributosemcomum.

Antesdesairimplementandoigualumloucodevemosentenderseissorealmentevivelequala
melhor forma de implementar. Realizar a implementao da Herana s vezes pode ser invivel e
podeserfacilmente trocada porcomposio na qual facilita na manuteno do cdigo e diminui o
acoplamentoentreasclasses.

OHibernatenosfornecevriasestratgiaspossveisparamapeamentoutilizandoHerana.Soelas:

TabelanicaporHierarquiasdeClasses
TabelaporSubclasse
TabelaporClasseConcreta

LetsGo.

TabelanicaporHierarquiasdeClasses

Essaestratgiademapeamentodenequesejageradaapenasumatabelaparatodasashierarquias
declasse.Asuperclasseirconterosdadoscomunseassubclassesdevempossuirumdiscriminador
nico.

Aimplementao

AClassePessoa

1 @Entity
https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 1/8
05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

1 @Entity
2 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
3 @DiscriminatorColumn(name="tipo",length=1,discriminatorType=Discriminato
4 @DiscriminatorValue("P")
5 publicclassPessoaimplementsSerializable{
6
7 @Id
8 @GeneratedValue(strategy=GenerationType.IDENTITY)
9 privateLongidPessoa;
10 privateStringnome;
11 @Column(insertable=false,updatable=false)
12 privateStringtipo;
13
14 //gettersandsettersomitidos
15 }

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
DenequalaestratgiademapeamentodeHeranaserutilizado

@DiscriminatorColumn(name=tipo,length=1,discriminatorType=DiscriminatorType.STRING)
Denequalatributoseridenticadordaclassemapeada
name:Deneonomedoatributoidenticadornatabela
length:Deneotamanhodacolunaidenticadora
discriminatorType:Denequalotipodevalorqueiridenticarasclasses

@DiscriminatorValue(P)
DeneovaloridenticadordaClassePessoa

Aquivaiumaobservaomuitoimportante,reparenoatributotipodaclassePessoa,eledevepossuir
o valor dos atributos insertable e updatable denidos como false, caso contrrio o Hibernate no
conseguirrealizaracriaodastabelasnobancodedados.

AClassePessoaFisica

1 @Entity
2 @DiscriminatorValue(value="F")
3 publicclassPessoaFisicaextendsPessoa{
4
5 privateStringcpf;
6
7 //gettersandsettersomitidos
8 }

@DiscriminatorValue(value=F)
DeneovaloridenticadordaClassePessoaFisica

AClassePessoaJuridica

1 @Entity
2 @DiscriminatorValue(value="J")
3 publicclassPessoaJuridicaextendsPessoa{
4
5 privateStringcnpj;
6
7 //gettersandsettersomitidos
8 }

@DiscriminatorValue(value=J)
https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 2/8
05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

@DiscriminatorValue(value=J)
DeneovaloridenticadordaClassePessoaJuridica

Vamosveragoraoresultadodanossaprimeiraimplementao

(hps://altieresm.les.wordpress.com/2011/07/single_table.png)
Resultadodaimplementaodetabelanicaporhierarquiasdeclasses

TabelaporSubclasse

Essaestratgiademapeamentodenequeumasubclassepodesermapeadaparasuaprpriatabela.
Essaestratgianoexigeumdiscriminador,noentanto,asubclassepossuiumatributoidenticador
queomesmoutilizadonasuperclasse.Nocasodessaestratgiademapeamentoutilizadocomo
identicadorachaveprimria(PK)dasuperclassetornandoaumachaveprimria/chaveestrangeira
(PK/FK)nassubclasses.

Aimplementao

ClassePessoa

1 @Entity
2 @Inheritance(strategy=InheritanceType.JOINED)
3 publicclassPessoaimplementsSerializable{
4
5 @Id
6 @GeneratedValue(strategy=GenerationType.IDENTITY)
7 privateLongidPessoa;
8 privateStringnome;
9
10 //gettersandsettersomitidos
11 }

@Inheritance(strategy=InheritanceType.JOINED)
DenequalaestratgiademapeamentodeHeranaserutilizado

ClassePessoaFisica

1 @Entity
2 @PrimaryKeyJoinColumn(name="idPessoa")
3 publicclassPessoaFisicaextendsPessoa{
4
5 privateStringcpf;
6
7 //gettersandsettersomitidos
8 }

@PrimaryKeyJoinColumn(name=idPessoa)
Denequalseroatributoidenticadordatabela

Observamos que no mapeamento dessa classe no utilizamos a anotao @GeneratedValue pois o


Hibernateseencarregadegerarosvalores,casovocutilizeaanotaonoirconseguirefetuara
criaodastabelasnobancodedadospeloHibernate.

ClassePessoaJuridica
https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 3/8
05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

ClassePessoaJuridica

1 @Entity
2 @PrimaryKeyJoinColumn(name="idPessoa")
3 publicclassPessoaJuridicaextendsPessoa{
4
5 privateStringcnpj;
6
7 //gettersandsettersomitidos
8 }

@PrimaryKeyJoinColumn(name=idPessoa)
Denequalseroatributoidenticadordatabela

Vamosveragoraoresultadodanossasegundaimplementao

(hps://altieresm.les.wordpress.com/2011/07/joined.png)
Resultadodaimplementaodetabelaporsubclasse

TabelaporClasseConcreta

Essa estratgia de mapeamento dene que seja gerada uma tabela por classe concreta. Cada tabela
possuiseusatributos,incluindoosatributosherdadosdasuperclasse.

Aimplementao

ClassePessoa

1 @Entity
2 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
3 publicabstractclassPessoaimplementsSerializable{
4
5 @Id
6 privateLongidPessoa;
7 privateStringnome;
8
9 //gettersandsettersomitidos
10 }

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
DenequalaestratgiademapeamentodeHeranaserutilizado

Um ponto muito importante a ser observado a utilizao da keyword abstract, caso no seja
utilizada, na hora da criao das tabelas o Hibernate ir criar uma nova tabela contendo apenas os
atributosdaclassePessoa.

ClassePessoaFisica

1 @Entity
https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 4/8
05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

1 @Entity
2 publicclassPessoaFisicaextendsPessoa{
3
4 privateStringcpf;
5
6 //gettersandsettersomitidos
7 }

ClassePessoaJuridica

1 @Entity
2 publicclassPessoaJuridicaextendsPessoa{
3
4 privateStringcnpj;
5
6 //gettersandsettersomitidos
7 }

Vamosveragoraoresultadodanossaterceiraimplementao

(hps://altieresm.les.wordpress.com/2011/07/table_per_class.png)
Resultadodaimplementaodetabelaporclasseconcreta

HerdarpropriedadesdeSuperclasses

Comumentetilcompartilharatributosparadiversasentidadesoutabelasdobancodedados,por
meio de uma tcnica presente no Hibernate conseguimos fazer isso de forma prtica e fcil. Para
realizar esse procedimento basta utilizar a anotao @MappedSuperClass, na qual a anotao pode
estartantonasubclassequantonasuperclasse.

Aimplementao

ClassePessoa

1 @MappedSuperclass
2 publicclassPessoaimplementsSerializable{
3
4 @Id
5 @GeneratedValue(strategy=GenerationType.IDENTITY)
6 privateLongid;
7 privateStringnome;
8 @Version
9 privateTimestampversao;
10
11 //gettersandsettersomitidos
12 }

@MappedSuperClass
Denequeosatributospertencentesaestclasseirosermapeadosporoutraclasse,ouseja,nesse
casoporumasubclasse.

ClassePessoaFisica

1 @Entity
https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 5/8
05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

1 @Entity
2 publicclassPessoaFisicaextendsPessoa{
3
4 privateStringcpf;
5
6 //gettersandsettersomitidos
7 }

ClassePessoaJuridica

1 @Entity
2 publicclassPessoaJuridicaextendsPessoa{
3
4 privateStringcnpj;
5
6 //gettersandsettersomitidos
7 }

Vamosveragoraoresultadodanossaquartaeltimaimplementao

(hps://altieresm.les.wordpress.com/2011/07/mappedsuperclass.png)
Resultadodaimplementaodaheranadepropriedades

Bom,comoditonoiniciodopostdevemosvericaraviabilidadedeutilizarHerana,principalmente
quandosuautilizaoestpresenteemclassespersistentes.Comestepostvocpodeverqualtipode
implementaodeHeranaatendeasuanecessidadeoupodesimplesmenteabandonaraHeranae
comearautilizarcomposio,queemminhaopinioaformamaisadequada.

Bomgalera,esperotersidoclaronasexplicaeseatoprximopost.

Abraosatodos.

Fontedepesquisa
DocumentaodoHibernate:hp://www.hibernate.org/docs(hp://www.hibernate.org/docs)

Tags: abstract (hps://altieresm.wordpress.com/tag/abstract/),


Anncios banco
(https://en.support.wordpress.com/about
de dados
(hps://altieresm.wordpress.com/tag/bancodedados/),
theseads/) BD
(hps://altieresm.wordpress.com/tag/bd/), herana (hps://altieresm.wordpress.com/tag/heranca/),
Hibernate (hps://altieresm.wordpress.com/tag/hibernate/), InheritanceType
(hps://altieresm.wordpress.com/tag/inheritancetype/), java
(hps://altieresm.wordpress.com/tag/java/), JOINED (hps://altieresm.wordpress.com/tag/joined/),
SINGLE_TABLE (hps://altieresm.wordpress.com/tag/single_table/), TABLE_PER_CLASS
(hps://altieresm.wordpress.com/tag/table_per_class/)

Thisentrywaspostedon09/07/2011at7:05pmandisledunderHibernate,Java.Youcanfollowany
responsestothisentrythroughtheRSS2.0feed.Youcanleavearesponse, or trackback from your
ownsite.

10 Respostas to Implementando Herana comHibernate

https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 6/8
05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

www.diegoporrio.comSays:
11/10/2011s9:49pm|Responder
Cara,muitobommesmo.Parabns.

DouglasRibeiroSays:
14/12/2011s1:49pm|Responder
Exatamenteoqueeuestavaprocurando,explicoudeumaformabemsimplesequefoibemfcil
compreender!
Valeu!!!!

RafaelRossiSays:
11/03/2012s6:52am|Responder
Irmo, show de bola esse exemplo seu. Para eu que estou comeando a estudar Java/Hibernate
issoaicouextremamentefacildeentendereajudoumuito.
Obrigado.

ConradoSays:
18/08/2012s4:51pm|Responder
Bomdia,zaprimeiraimplementaocomotipo,nessecasoemmeucontrolleroquefariano
aonovoesalvar?
Estoufazendoumtelasomente,eestouutilizandootipoemumcombopassandoparaeleFem
casodesicaeFOemcasodefornecedor(queseriameujuridica).

AltieresSays:
28/08/2012s5:49pm|Responder
BomdiaConrado,
desculpeademorapararesponder,maisquemeusdiasestobemocupados!
BastavericaroCombo,seeleestivercomFvocsalvadao.salvar(sica)ecasoeleestejaFO
vocsalvadao.salvar(juridica).
apenasumexemplo.Casoprecisedemaisajudapodemeenviarumemail.
Abraos!

DanielSays:
14/11/2012s7:56am|Responder
TantonoTabelaporSubclasseeTabelaporClasseConcreta
as classes lhas nao podem ter primary key? se eu precisar ter as PK na lhas, como eu fao a
herana?obg.

BrunoSays:
22/05/2013s8:57pm|Responder
Muitolegal,didticoefuncional.ParabnsAltieres

ThiagoSays:
19/01/2014s5:02am|Responder
Boa noite Programador thiago , gostaria de Saber , meu caro , como fao para listar os dados
numa AbstractTableModel em relao a persistencia JPA existe um mtodo para que a JPA
possacarregarnaTabelaosmeusdados?Abraos. Muitobomoseupost.Copieipraminha
pessoa e graas ao mesmo , j z vrios exemplos com Persistencia , JPA no NetBeans e SQL
Server.valeu

PetrosSchSchillingSays:
27/02/2014s9:48pm|Responder
Muitobom!Estavagerandotudocomacolunatype(quenogostomuito).Excelenteexplicao.
ThiagoMarquesSilvaSays:
https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 7/8
05/02/2017 ImplementandoHeranacomHibernate|AltieresdeMatos

ThiagoMarquesSilvaSays:
13/08/2014s10:38pm|Responder
Muitotil!Sucinto,claro,precisonasexplicaes.Parabns!

CrieumwebsiteoubloggratuitonoWordPress.com.
Entries(RSS)andComments(RSS).

https://altieresm.wordpress.com/2011/07/09/implementandoherancacomhibernate/ 8/8

S-ar putea să vă placă și