Escolar Documentos
Profissional Documentos
Cultura Documentos
LOGIN
comentrios
postfavorito(6)
Gostei(2)
Curtir
(0)
OMapeamentoObjetoRelacional(ORM)consisteemumaformaautomatizadae
transparentedepersistirobjetospertencentesaumaaplicaoemsuasrespectivas
tabelasemumbancodedadosrelacional,usandoparaisso,tecnologiascomoo
Hibernate,responsveispordescreveromapeamentoentreosobjetoseobancode
dados(BAUEReKINK,2005).
ConformeLuckoweMelo(2010),umasoluoORMconsistebasicamentenos
seguintespontos:
UmaAPIpararealizarasoperaesCRUDbsicasemobjetosdeclasses
persistentes
UmalinguagemouAPIparaespecificaodeconsultasreferentessclasses
oussuaspropriedades
Umrecursoparaespecificaromapeamentodemetadados
UmatcnicaparaqueaimplementaoORMinterajacomobjetos
transacionaispermitindoexecutarverificaesdotipoleiturasuja
(dirtycheking),buscasporassociaesociosas(lazyassociationfetching)e
outrastcnicasdeotimizao.
Hibernate
OHibernateasoluoORMJavaqueconsisteemumaferramentapararealizaro
mapeamentoobjetorelacionaldeformacompleta.Atecnologiaseguea
especificaoJPA(JavaPersistenceAPI),quetratadeentidades,mapeamentos,
interfacesparagerenciarapersistnciaelinguagemdeconsulta(LUCKOWeMELO,
2010).
OHibernatefuncionacomoumintermedirioentreainteraodoaplicativocomo
bancodedadosrelacional,assimodesenvolvedorpoderseconcentrarno
problemadonegcioasertrabalhado.Asoluotambmnoexigeaobedincias
regrasespecficasdoHibernateeseintegrafacilmenteaosaplicativosnovose
existentes,norequerendomudanasbruscasnorestantedaaplicao.(BAUERe
KING,2005).
AarquiteturadoHibernatebaseadaeminterfacesdeprogramao.Conforme
BauereKink(2005),taisinterfacespodemserclassificadascomo:
InterfaceschamadasporaplicativosparaexecutaroperaesCRUDbsicase
deconsulta.Essasinterfacessoopontoprincipaldalgicadenegciosde
aplicativosdoHibernate,soelas:Session,TransactioneQuery
Interfaceschamadaspelocdigodeinfraestruturadoaplicativoparaconfigurar
oHibernate,queincluemprincipalmenteainterfaceConfiguration
Interfacescallback,quepermitemareaodoaplicativoaoseventosque
vieremaocorrerdentrodoHibernate
Interfacesquepermitemestenderasfuncionalidadesdemapeamentodo
Hibernate,comoUserType,CompositeUserTypeeIdentifierGenerator.
AFigura1apresentaoesquemadealtonveldaarquiteturadoHibernate.O
diagramamostraarelaodomesmocomaaplicaoeobancodedados,bem
comosuaconfiguraoepropriedadesnecessriasparaapersistnciadosdados.
Figura1.VisogeraldealtonveldaarquiteturadoHibernate.
AtecnologiaHibernatesuportamuitasabordagenseaFigura2apresentasua
arquiteturacompreensiva,ondeosdetalhesdaaplicaosoabstradose
especificadospeloHibernate.
Figura2.VisogeraldealtonveldaarquiteturacompreensivadoHibernate.
Essediagramaestdividobasicamenteemtrscamadas:
Aplicao,ondeestpresentealgicadenegcio
Camadadepersistncia,ondeseencontramaspropriedadesdoHibernate
e
Bancodedados,ondefinalmenteosdadossopersistidos.
importantequeseconheaoconceitodasinterfacespresentesnacamadade
persistnciadodiagrama:
Session:PrincipalinterfaceusadapelosaplicativosdoHibernate.ondeo
HibernateiniciadoparaarealizaodeoperaesCRUD,execuode
consultas,controledetransaesetc.Essainterfaceresponsvelpelo
gerenciamentodeestadosdosobjetos
SessionFactory:ForneceaoaplicativoinstnciasdainterfaceSession.Realiza
aindaoarmazenamentodeinstruesSQLemetadadosdemapeamento
utilizadospeloHibernateemtempodeexecuo
Transaction:Realizaatarefadeabstrairocdigodoaplicativodousurioque
implementariaatransaosubjacente.Talabstraopermiteocontroledos
limitesdetransaespeloaplicativo,mantendoaportabilidadedosaplicativos
doHibernatemesmoentreambientesdeexecuodistintos.Ainterface
Transactionopcional
TransactionFactory:ForneceinstnciasdainterfaceTransaction.Ainterface
opcional
ConnectionProvider:ConsistenumafbricadeconexesJDBC,abstraindo
DriverManageradjacentesdaaplicao.Tambmopcional.
Queryconsulta=sessao.createQuery(selectffromFuncionariowheref.categoria=Administra
Essaconsultafazabuscadefuncionriosquepertenamadministrao.Diferente
dautilizaonativadeconsultasSQLquesoaplicadasdiretamentestabelasdo
bancodedados,aoperaodeconsultareferenciaoobjetoFuncionario.
AinterfacecriteriasimilarQuery,permitindoacriaoeexecuodeconsultas
baseadasemcritriosorientadosaobjetos.umadasmelhoresabordagensquando
umaconsultapassaasermuitocomplexa.Consistebasicamentenaformulaode
consultastendoemvistaoscritriosdousurio.Ocdigoaseguircontmuma
consultaenvolvendoapenasumaclasse,ondeumainstnciadaAPIdefinidapara
receberumainstnciadainterfaceSessionquepermiteacriaodeumaconsulta:
Criteriacriteria=sessao.createCriteria(Funcionario.class);
List<Funcionario>funcionarios=criteria.list();
Umavariveldotipolistespecificadaerecebeumalistadefuncionriosno
momentodainvocaodomtodolistdainterfacecriteria.
CREATEDATABASEFUNCIONARIO_DB;
Emseguida,devesercriadaatabelafuncionrio,conformeasintaxedecriaoda
tabelapresentenaListagem1.
Listagem1.ComandoSQLparaacriaodatabelafuncionario.
CREATETABLEFUNCIONARIO(
ID_FUNCIONARIOSERIALPRIMARYKEY,
NOMEVARCHAR(80)NOTNULL,
CPFVARCHAR(14)NOTNULL,
CATEGORIAVARCHAR(20)NOTNULL,
SALARIONUMERIC(8,2)NOTNULL
);
Instalao do Hibernate
ParainiciarostrabalhoscomoHibernate,necessrioquesefaaodownloaddo
mesmonoseusiteoficial(videseoLinks).Baixeoarquivo.zipcorrespondente
ltimaversodatecnologia.Abibliotecacomplementarslf4jtambmdeveser
adquirida(seoLinks).Faaodownloaddoarquivo.zipdasduasverses
disponveis.Demodoapermitiracomunicaodaaplicaocomobancodedados
paraarealizaodasoperaesnecessrias,precisofazerusododriverJDBC
JavaDatabaseConnectivity,queespecificacomoessacomunicaoserfeita.Para
esteestudo,utilizaremosoSGBDPostgreSQL,cujodownloaddodriverpodeser
feito(seoLinks).Apsotrminodosdownloads,extraiaosarquivos.
AbraoEclipse,casoaindanotenhafeitoodownloaddoIDE,useolinkdisponvel
naseoLinks.ExistemvriasopesdoIDEparadownload,masparaeste
exemploutilizaremosaopoEclipseIDEforJavaEEDevelopers.Depoisdeaberta
crieumnovoprojetoJavachamadoHibernatePersistence.Crietambmapastalib
doprojeto,quedeverreceberosarquivos.jarqueforambaixadosanteriormente.
CopieosmesmosparaapastainternamenteeadicioneasaoBuildPathdoprojeto.
NaFigura3observecomoficaroprojetoHibernatePersistenceapsserem
adicionadastodasasbibliotecaseapsacriaodetodosospacoteseclasses.
Figura3.ProjetoHibernatePersistencefinalizado.
Configurao do Hibernate
OarquivodeconfiguraodoHibernatehibernate.cfg.xmldeveestarnopacote
raizdoprojeto.Omesmocontminformaescomoaspropriedadesdaconexo
JDBCparaoHibernate,aconfiguraoparaopooldoprojetoeopesdedebug(as
configuraesdedebugsoopcionais).AListagem2contmoarquivode
configuraodoHibernateparaoprojetoHibernatePersistence.
Listagem2.ArquivodeconfiguraodoHibernate.
<?xmlversion="1.0"encoding="UTF8"?>
<!DOCTYPEhibernateconfigurationPUBLIC"//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernateconfiguration3.0.dtd">
<hibernateconfiguration>
<sessionfactory>
<!ConfiguracaodaconexaocomobancoPostgreSQLedialeto>
<propertyname="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<propertyname="hibernate.connection.driver_class">org.postgresql.Driver</property>
<propertyname="hibernate.connection.url">jdbc:postgresql://localhost:5432/funcionario_db</p
<propertyname="hibernate.connection.username">postgres</property>
<propertyname="hibernate.connection.password">administrator</property>
<!ConfiguraesdeC3PO>
<propertyname="c3po.min_size">5</property>
<propertyname="c3po.max_size">20</property>
<propertyname="c3po.timeout">300</property>
<propertyname="c3po.max_statements">50</property>
<propertyname="c3po.idle_test_period">3000</property>
<!Configuracoesdedebug>
<propertyname="show_sql">true</property>
<propertyname="format_sql">true</property>
<propertyname="generated_statistics">true</property>
<propertyname="use_sql_comments">true</property>
</sessionfactory>
</hibernateconfiguration>
Aprimeirapropriedadedefinidanoarquivotemcomonomedialect,quesempre
receberumaclasseDialectcomovalor,demodoapermitiracomunicaodo
Hibernatecomobancodedadosemquesto.AlmdodriverJDBC,todobancode
dadosprecisateraclasseDialectparaconversarcomoHibernate.Asprximas
propriedadesdoarquivopertencemconexocomobancodedados,incluindo
informaescomoaclassedodriverJDBC,aURLdeconexo,ousurioeasenha
deconexocombancodedados.C3POopooldeconexoutilizadopara
especificarasconfiguraesdepooldoHibernate,eomesmocontmasseguintes
propriedades:
c3po.min.size:Defineonmeromnimodeconexesquesomantidassempre
preparadaspeloC3PO
c3po.max.size:Nmeromximodeconexesnopool
c3po.timeout:Tempolimitepararemoodeconexesinativasnopool
c3po.max.statements:Mximodedeclaraesqueiroparacache
c3po.idle_test_period:Tempodeinatividadedeumaconexoantesdeser
validada.
Finalmentesoespecificadososparmetrosdaspropriedadesdedebug.Noarquivo
asseguintespropriedadesdedepuraoforamdefinidas:
show_sql:HabilitaoaparecimentodetodasassadasparacomandosSQLno
console
format_sql:ImprimeocomandoSQLexecutadodeformalegvel
generate_statistics:Habilitaacoletadeestatsticasparaposteriorajustede
desempenho
use_sql_comments:PermitequeoHibernategerecomentriosjuntoaoSQL
prafacilitaradepurao.
packagehibernatePersistence.util;
importorg.hibernate.*;
publicclassHibernateUtil{
privatestaticfinalSessionFactorysessionFactory=buildSessionFactory();
privatestaticSessionFactorybuildSessionFactory(){
try{
Configurationcfg=newConfiguration();
cfg.configure("hibernate.cfg.xml");
returncfg.buildSessionFactory();
}catch(Throwablee){
System.out.println("Erro:"+e);
thrownewExceptionInInitializerError(e);
}
}
publicstaticSessionFactorygetSessionFactory(){
returnsessionFactory;
}
}
OmtodoestticoprivadobuildSessionFactorydaclasseHibernateUtil.java
responsvelporcriarumaSessionFactorydoHibernatebaseadanoarquivo
hibernate.cfg.xml.UmapropriedadeSessionFactoryserretornadapelomtodo
getSessionFactoryquandoesteforchamado.
packagehibernatePersistence.conexao;
importorg.hibernate.Session;
publicclassConexaoHibernatePostgreSQL{
publicstaticvoidmain(String[]args){
Sessionsessao=null;
try{
sessao=HibernateUtil.getSessionFactory().openSession();
System.out.println("Conectou!");
}finally{
sessao.close();
}
}
}
Nessaclasse,omtodogetSessionFactorychamadoeretornaumaSessionFactory
baseadanoarquivodeconfiguraodoHibernate,possibilitandoaaberturadeuma
Session.Issopermitequeaconexocomobancodedadosemquestoseja
realizada.AsadaparaaexecuodaclassedeveseraexpressoConectou!.
packagehibernatePersistence.funcionario;
importjava.io.Serializable;
importjavax.persistence.*;
@Entity
publicclassFuncionarioimplementsSerializable{
privatestaticfinallongserialVersionUID=1L;
@Id
@GeneratedValue
privateintid_funcionario;
privateStringnome;
privateStringcpf;
privateStringcategoria;
privatefloatsalario;
//gerargetsesets
}
Obrigatoriamenteaclassedeverconteraannotation@Entity,assimoHibernate
reconhecersuaspropriedadescomosendoreferentestabelacorrespondente
criadanobancodedados.Asannotations@Ide@GeneratedValuedefinemqueo
campoid_funcionariocorrespondechaveprimriadatabelaequeestaserauto
incrementada.
OarquivodeconfiguraodoHibernate,hibernate.cfg.xml,deverseralteradopara
reconheceraclasseFuncionario.java.Aseguirtemosalinhademapeamentoda
classeaseradicionadaaoarquivoantesdatag:
<mappingclass=HibernatePersistence.funcionario.Funcionario/>
packagehibernatePersistence.funcionario;
importhibernatePersistence.util.HibernateUtil;
importjava.util.ArrayList;
importorg.hibernate.*;
publicclassFuncionarioHibernateDAO{
privateSessionsession;
privateTransactiontransaction;
publicvoidsalvar(Funcionariofuncionario){
try{
this.session=HibernateUtil.getSessionFactory().openSession();
this.transaction=this.session.beginTransaction();
this.session.save(funcionario);
this.transaction.commit();
}catch(HibernateExceptione){
System.out.println("Nofoipossvelinserir.Erro:"
+e.getMessage());
}finally{
try{
if(this.session.isOpen()){
this.session.close();
}
}catch(Throwablee){
System.out.println("Erroaofecharaoperao.Mensagem:"
+e.getMessage());
}
}
}
publicvoiddeletar(Funcionariofuncionario){
try{
this.session=HibernateUtil.getSessionFactory().openSession();
this.transaction=this.session.beginTransaction();
this.session.delete(funcionario);
this.transaction.commit();
}catch(HibernateExceptione){
System.out.println("Nofoipossveldeletar.Erro:"
+e.getMessage());
}finally{
try{
if(this.session.isOpen()){
this.session.close();
}
}catch(Throwablee){
System.out.println("Erroaofecharaoperao.Mensagem:"
+e.getMessage());
}
}
}
publicvoidalterar(Funcionariofuncionario){
try{
this.session=HibernateUtil.getSessionFactory().openSession();
this.transaction=this.session.beginTransaction();
this.session.update(funcionario);
this.transaction.commit();
}catch(HibernateExceptione){
System.out.println("Nofoipossvelalterar.Erro:"
+e.getMessage());
}finally{
try{
if(this.session.isOpen()){
this.session.close();
}
}catch(Throwablee){
System.out.println("Erroaofecharaoperao.Mensagem:"
+e.getMessage());
}
}
}
publicArrayList<Funcionario>listar(){
ArrayList<Funcionario>funcionarios=newArrayList<Funcionario>();
try{
this.session=HibernateUtil.getSessionFactory().openSession();
this.transaction=this.session.beginTransaction();
Criteriafiltro=this.session.createCriteria(Funcionario.class);
funcionarios=(ArrayList<Funcionario>)filtro.list();
this.transaction.commit();
}catch(Throwablee){
if(this.transaction.isActive()){
this.transaction.rollback();
}
}finally{
try{
if(this.session.isOpen()){
this.session.close();
}
}catch(Throwablee){
System.out.println("Erroaofecharaoperao.Mensagem:"
+e.getMessage());
}
}
returnfuncionarios;
}
}
Aseguirobserveaanlisedaslinhasmaisimportantesdomtodo:
this.session=HibernateUtil.getSessionFactory().openSession()Nestalinha
umavariveldotipoSessionrecebeoresultadodachamadaaomtodo
getSessionFactory.EssemtodoretornaumasessionFactory,possibilitando
assimaaberturadasessoatravsdomtodoopenSession
this.transaction=this.session.beginTransaction()Avariveltransaction
recebesessionque,porsuavez,iniciaatransaoatravsdachamadaao
mtodobeginTransaction(essalinhaopcional)
this.session.save(funcionario)Achamadaaomtodosaverealizauma
operaodeinsertnobancodedados,assim,asinformaesdofuncionrio
passadascomoparmetrosoinseridasnomesmo
this.transaction.commit()Atransaorealizadaconfirmadaatravsda
chamadaaomtodocommit
Osmtodosdeletarealterarnosedistinguemmuitodomtodosalvar,dessa
forma,serfeitaaanliseapenasdaslinhasquenoserepetem.
Nomtododeletartemosalinhathis.session.delete(funcionario)ondeomesmo
executaumaoperaodedeletenobancodedados,excluindoosregistros
correspondentesaosdofuncionriopassadoporparmetro.
Jomtodoalterarexecutaaoperaodeupdatenobancodedadosatravsda
linhathis.session.update(funcionario).NestalinhaavariveldotipoSessionchama
omtodoupdatedoHibernatequerealizaumaoperaodeupdatenobancode
dados,alterandoasinformaesdeumfuncionriojexistentenomesmocomas
novasinformaespassadasporparmetro.
OmtodolistardotipoArrayListretornaumalistacomosfuncionriosexistentesno
banco.Nestemtodopodemosdestacarasseguinteslinhas:
Criteriafiltro=this.session.createCriteria(Funcionario.class)Umavarivel
dotipocriteriarecebeavarivelglobalsession,quefazumachamadaao
mtodocreateCriteria.Essemtodofazumaconsultaaobancoatravsda
classefuncionrio
funcionarios=(ArrayList)filtro.list()OArrayListdefuncionriosdeclarado
noinciodomtodorecebeavarivelfiltro,quecontmoresultadoda
consultarealizadanalinhaanterior.Omtodolistinvocadopelavarivel
retornaumalistadosobjetosconsultados.
Inserindo funcionrios
NopacotehibernatePersistence.funcionariofoicriadaaclasse
OperacoesFuncionario.java,presentenaListagem11.Essaclasseapresentaum
exemplodeinserodefuncionriosnobancodedados.
Listagem11.ClasseOperacoesFuncionario.java
packagehibernatePersistence.funcionario;
publicclassOperacoesFuncionario{
publicstaticvoidmain(String[]args){
FuncionarioHibernateDAOfuncionarioHibernateDAO=newFuncionarioHibernateDAO();
String[]nomes={"LysMaria","MarliaSousa"};
String[]cpfs={"111.111.11111","222.222.22222"};
String[]categorias={"Administrativo","Terceirizado"};
float[]salarios={4500,2500};
Funcionariofuncionario=null;
for(inti=0;i<codigo.length;i++){
funcionario=newFuncionario();
funcionario.setId_Funcionario(codigo[i]);
funcionario.setNome(nomes[i]);
funcionario.setCpf(cpfs[i]);
funcionario.setCategoria(categorias[i]);
funcionario.setSalario(salarios[i]);
funcionarioHibernateDAO.salvar(funcionario);
}
System.out.println(funcionarioHibernateDAO.listar().size()+"FuncionriosforamCada
}
}
NalinhafuncionarioHibernateDAO.salvar(funcionario),omtodosalvarchamao
mtodosavedoHibernate,queexecutaumainstruoinsertnobancodedados.A
sadaparaaexecuodaclasseseramensagem2Funcionriosforam
cadastrados.
Osmtodosdeletarealterarpodemserinvocadosdamesmaformaqueomtodo
salvar,executandoinstruesdeupdateedeleterespectivamente.
AsoluoORMdoHibernateapresentasecomoumatcnicacompletaquetorna
bemmaissimpleseclarooprocessodepersistnciadedados.Atcnicadispensao
usodemtodoscomopreparedStatement,responsveisportornarosmtodospara
execuodeoperaesCRUDextensosededifcilcompreenso.Almdisso,o
Hibernatepossibilitaareduoconsiderveldaquantidadedecdigonas
aplicaes.
Links
Bauer,ChristianKing,GavinHIBERNATEEMAO.Ed.CinciaModernaLtda.Rio
deJaneiro,2005.ISBN8573934042.
PERSISTINDOOSDADOSCOMOHIBERNATE.
http://www.caelum.com.br/apostilavraptorhibernate/persistindoosdadoscomohibernate/
HIBERNATEREFERENCEDOCUMENTATION
https://docs.jboss.org/hibernate/orm/3.5/reference/en/html
Luckow,DcioH.eMelo,AlexandreA.PROGRAMAOJAVAPARAWEB.Ed.
Novatec.SoPaulo,2010.ISBN9788575222386.
POSTGRESQL
http://postgresql.org
HIBERNATE
http://www.hibernate.org
SLF4J
http://www.slf4j.org
JDBCdoPostgreSQL
https://jdbc.postgresql.org/
ECLIPSE
http://www.eclipse.org/downloads/
AnaPatriciaDeSousa
GraduandaemAnliseeDesenvolvimentodeSistemasIFPITcnicaemLogsticaSenac/PI
Oquevocachoudestepost?
Gostei(2)
(0)
Todososcomentarios(3)
Postardvida/Comentrio
Meuscomentarios
FlavioMorigi
MVP
Estoutentandomontaroprojeto,masnoencontreiospacotes"jta1.1.jar"enemo"lucene
core4.10.4.jar".
Estouutilizandoospacotesmaisrecentes(versoestvel)doslinksindicados:
hibernaterelease4.3.10.Final.zip
slf4j1.7.12.zip
postgresql9.31103.jdbc3.jar
[h4dias]Responder
[autor]AnaPatriciaDeSousa
Boanoite!
Osarquivosestodisponveispradownloadnesteslinks:
http://mvnrepository.com/artifact/javax.transaction/jta/1.1
http://mvnrepository.com/artifact/org.apache.lucene/lucenecore
[h4dias]Responder
FlavioMorigi
MVP
Muitoobrigado.
[h2dias]Responder
Publicidade
Servios
Incluaumcomentrio
AdicionaraosFavoritos
Marcarcomolido/assistido
Incluiranotaopessoal
Versoparaimpresso
+Java
Mais posts
Video aula
Video aula
DevMedia
Curtir
67.790pessoascurtiramDevMedia.
PluginsocialdoFacebook
HospedagemwebporPorta80WebHosting