HIBERNATE
Benefrancis do Nascimento
Anhanguera Educacional
benefrancis@gmail.com
RESUMO
ABSTRACT
1
2 Mapeamento objeto relacional com Hibernate
1. INTRODUÇÃO
A maioria dos sistemas de software que têm o seu desenvolvimento iniciado atualmen-
te (não são sistemas legados) utiliza Análise e Projeto Orientados a Objetos (AO/PO)
(RUMBAUGH, 1991). Visando apresentar para os desenvolvedores de sistemas orien-
tados a objetos uma alternativa para armazenamento de atributos de objetos gerados
por suas aplicações, desenvolvemos este material. Após a leitura deste artigo você será
capaz de:
2. REVISÃO BIBLIOGRÁFICA
Para melhor entendimento dos tópicos abordados, iniciaremos este artigo fazendo re-
visão bibliográfica das tecnologias envolvidas respeitando a ordem a seguir:
Caso esteja familiarizado com esses conceitos poderá avançar para o próximo
capítulo onde abordaremos o mapeamento objeto relacional com hibernate e a HQL.
Durante varias décadas, a construção de programas foi abordada sob um ponto de vista: de-
composição algorítmica. Assim, grandes programas são divididos em módulos e estes, em
funções. O paradigma orientado a objetos (OO) oferece uma alternativa diferente para parti-
cionar um problema, que não se baseia apenas em algoritmos (BOOCH, 1994).
Já BLAHA et. al. (1997, p1) definem orientação a objeto como sendo “a estraté-
gia para a organização de sistemas em coleções de objetos que se interagem combinan-
do dados e comportamentos”.
2.2. Persistência
De modo geral, persistência significa continuar a existir, preservar, durar longo tempo
ou permanecer (OGLIO, 2009). No contexto de programação orientada a objeto, a per-
sistência significa a possibilidade de esses objetos serem armazenados em meio externo
à aplicação, portanto deverá permitir que esses objetos não sejam voláteis. Atualmente
os bancos de dados relacionais são o meio mais utilizado para isso, porém não são os
únicos.
A história da SQL começa em 1970 com a publicação por Codd, no ACM Jour-
nal, de um artigo intitulado “A Relational Model of Data for Large Shared Data Banks”. O
modelo proposto por Codd é hoje considerado a base de trabalho para qualquer Siste-
ma de Gestão de Base de Dados Relacional (SGBDR).
À técnica de mapear os atributos e relacionamentos das classes que darão origem a ob-
jetos que serão persistidos em bancos de dados relacionais, dar-se-á o nome de mape-
amento objeto relacional ou em inglês Object Relational Mapping (ORM).
ra acesso a banco de dados, bem como, de instruções em DML4 que ele escreveria caso
não utilizasse a ferramenta. É, portanto, uma ferramenta que acelera o desenvolvimen-
to de software orientado a objeto que necessita trabalhar em conjunto com banco de
dados relacional.
É indicado para sistemas que contam com a maior parte da lógica de negócios
na própria aplicação, dependendo pouco de funções específicas do banco de dados. Ou
seja, o hibernate não é indicado para sistemas em que as regras de negócio estão sob
responsabilidade do banco de dados, codificadas em stored procedures ou triggers.
4
DML: linguagem de manipulação de dados utilizada nos SGBDs.
Benefrancis do Nascimento, Jaime K. Ossada 7
JPA é uma API padrão do Java para persistência que deverá ser implementada pelos
frameworks que queiram seguir o padrão de mapeamento. A JPA define um meio de
mapeamento Objeto-Relacional para objetos Java simples e comuns (POJOS).
ELLIOTT et al (2009, p.125) afirmaram que: “Basicamente, uma anotação é uma maneira de
acrescentar informações sobre uma parte do código (no mundo Java, geralmente uma classe,
um campo ou método) para ajudar as ferramentas entenderem como o código está sendo
utilizado ou para permitir a automatização, poupando trabalho”.
1:N @Entity
Public class Pessoa{
@OneToMany
Private Collection<Telefone> telefones;
}
N:1 @Entity
Public class Telefone{
@ManyToOne
Private Pessoa pessoa;
}
Benefrancis do Nascimento, Jaime K. Ossada 9
N:N @Entity
Public class Pessoa{
@ManyToMany
Private Collection<Telefone> telefones;
}
@Entity
Public class Telefone{
@ManyToMany
Private Collection<Pessoa> pessoas;
}
Embutidas Public class Pessoa{
@Embeddable
Private Telefone telefone;
String nome;
}
@Embeddable
Public class Telefone{
Private int ddd;
Private String numero;
}
Mapeando Herança
4. ESTUDO DE CASO
Ide Netbeans 6.8 completo (já vem com o framework hibernate embu-
tido)5;
Banco de dados Mysql6;
Mysql-connector-java-5.1.6-bin.jar ou versão superior7
No MYSQL:
Abra o banco de dados MySql e execute o comando CREATE DATABASE `ORM` po-
derá utilizar o HeidiSQL8 para esta tarefa ou usar o prompt de comandos.
5
Disponível em: http://netbeans.org
6
Disponível em: http://www.mysql.com/downloads/mysql/
7
Disponível em: http://www.mysql.com/downloads/connector/j/
8
Front-end grátis para banco de dados MySql - disponível em: http://www.heidisql.com
12 Mapeamento objeto relacional com Hibernate
No Netbeans:
Na janela que será aberta é o local onde será configurado nosso ambiente. Para confi-
guração deverá seguir os quatro passos, conforme segue:
2. Nome e local: para o nome digite “ORM” sem as aspas. Aceite o local padrão para lo-
cal e pasta do projeto;
3. Servidor e configurações: para servidor escolha Apache Tomcat. Versão do Java esco-
lha Java EE 5 ou superior se for o caso;
O Netbeans já está apto para inicio da codificação. Se tudo deu certo o Netbe-
ans criou o arquivo “hibernate.cfg.xml” no pacote padrão com as configurações para
acessar o banco de dados MySql. Altere o hibernate.cfg.xml conforme figura abaixo
Benefrancis do Nascimento, Jaime K. Ossada 13
para que contenha o nome das classes que serão mapeadas . Colocamos algumas ou-
tras propriedades, porém são opcionais.
Este arquivo em alguns sistemas poderá não existir, porém em seu lugar deve-
rá existir um arquivo “hibernate.properties”.
Definimos o dialeto necessário para trabalhar com o MySql. O hibernate saberá todas as características deste
SGBDR. Para o programador basta apenas dizer qual dialeto a usar.
Show_sql: Aqui coloque true caso desejar que as instruções SQL sejam exibidas no console.
Format_sql: Exibirá o SQL formatado caso esteja como true.
Pool_size: Tamanho da nossa piscina de conexões. No nosso caso, o hibernate poderá manter 10 conexões
com o banco de dados.
Hbm2dll.auto: Esta ferramenta do hibernate gera o schema do banco de dados a partir das classes mapea-
das. É executada quando criamos o SessioFactory que veremos em breve. Os valores possíveis são:
1. Create: Cria as tabelas no banco de dados;
2. Create-drop: Cria a tabela quando o SessionFactory for iniciado e deleta todos os registros da base
de dados quando encerra a aplicação. Jamais utilizar em ambiente de produção.
3. Update: Atualiza colunas e tabelas. Esta opção não apaga colunas, somente insere novas se for ne-
cessário.
5.2. Codificação
Criaremos agora nossas classes Java bean para criar uma classe basta clicar no pacote
com o botão direito do mouse, selecionar “NOVO” > “Classe Java”. Veja imagem abai-
xo:
Benefrancis do Nascimento, Jaime K. Ossada 15
Criaremos classes com nome e pacote conforme descrição contida na tabela abaixo:
Pessoa.java
PF.java
PJ.java
Telefone.java
Iniciaremos agora a codificação da classe que será responsável pela conexão com o hi-
bernate e retorno da sessão desta conexão.
20 Mapeamento objeto relacional com Hibernate
ConexaoHibernate.java
PessoaDAO.java
Para salvar uma pessoa no banco de dados utilizaremos polimorfismo. Repare que no
método salvar o parâmetro esperado é do tipo Pessoa, entretanto se enviarmos uma PF
ou PJ as informações serão salvas corretamente nas tabelas do banco de dados. Outra
técnica importante da orientação a objeto empregada nesta classe é a sobrecarga de mé-
todos presente no método Consultar (veja a assinatura dos métodos).
TelefoneDAO.java
GerarTabelas();
Benefrancis do Nascimento, Jaime K. Ossada 23
Persistir();
main(String[] args)
9
lembre-se que deverá criar métodos construtores nas classes do pacote br.com.ORM.bean
24 Mapeamento objeto relacional com Hibernate
vamos no banco de dados. Logo em seguida criamos uma pessoa jurídica adicionamos
mais um telefone à lista de telefones, associamos à lista de telefones à pessoa jurídica e
chamamos o método Salvar.
Faremos agora três métodos para exemplificar como consultar, alterar e apa-
gar objetos persistidos. Esses métodos deverão ser incluídos na classe PessoaDAO.java
que se encontra no pacote br.com.ORM.hibernateDAO.
Tendo este código como base, fica fácil codificar consultas (lembre-se de usar a
sobrecarga de métodos), bastando apenas mudar os parâmetros, a query HQL e o tipo
de retorno conforme a situação. Abaixo comentaremos os pontos mais relevantes do
método consultar.
O método recebe como parâmetro uma String que deverá ser o nome da pes-
soa que se deseja consultar . O retorno será uma lista de pessoas.
A sessão cria uma query no padrão HQL que espera pelo parâmetro nome.
O ponto de número “1” chama atenção para o método merge que recebe o ob-
jeto que será alterado na tabela do banco de dados.
Repare que este método é muito parecido com o método atualizar, o que muda de um para
outro é apenas o método utilizado da sessão que neste caso é o delete(p) passando como pa-
râmetro um objeto do tipo pessoa.
6. CONSIDERAÇÕES FINAIS
benefrancis@gmail.com
jaimeossada@uol.com.br
AGRADECIMENTOS
Sou imensamente agradecido a Agesandro Scarpioni, Carla Pelissoni, Cris Becker, Fá-
bio Luís R. Pelissoni, Isaías Inácio de Deus, Jorge Cruz, Luís Vinícius Antunes Palma,
Marco Akio, Michel Masiero de Aquino, Paulo Nunes, Paulo Roberto da Silva, Pedro
Brigatto, Ricardo Cirillo e Vinicius Asta Pagano que ministraram aulas e palestras de
excelente qualidade no decorrer do meu aprendizado de análise e desenvolvimento de
sistemas, ao Jaime K. Ossada meu orientador neste artigo científico, a minha maravi-
lhosa mãe Maria Raquel do Nascimento que é pra mim referência de pessoa digna e
trabalhadora, a Christian Bauer, Gavin King, Steve Ebersole, Max Andersen e todas as
pessoas que ajudaram a criar e aprimorar o Hibernate, a minha esposa Edilaine Sudré
Marcelino do Nascimento e aos meus filhos Bruno Sudré do Nascimento e Erick Sudré
do Nascimento por me apoiarem nos mais desafiadores e emocionantes projetos que
participo.
Benefrancis do Nascimento, Jaime K. Ossada 27
REFERÊNCIAS
BLAHA M.; PREMERLANI W. Object-Oriented Modeling and Design for Database
Applications. Prentice Hall; United States ed edition (July 27, 1997).
BOOCH G. Object Oriented Analysis and Design with Applications. Addison-Wesley, 1994.
CHAUDRI, A. B; ZICARI, R. Succeeding with Object Databases: A Practical Look at Today's
Implementations with Java and XML. 1. Ed. EUA: Willey Computer Publishing., 2000.
CODD, T. A Relational Model of Data for Large Shared Data Banks. Communications of the
ACM, Vol. 13, No. 6, 1970.
ELLIOTT J.; O’BRIEN T.M.; FOWLER R. Dominando Hibernate. Tradução do original:
Harnessing Hibernate. Rio de Janeiro: AltaBooks, p.125, 2009.
KOSCIANSKI A.; SOARES M.S. Qualidade de software: aprenda as metodologias e técnicas
mais modernas para o desenvolvimento de software. 2. Ed. São Paulo: Novatec Editora, p. 281-
283, 2007.
OGLIO D.P. PHP: programando com orientação a objetos. 2. Ed. São Paulo: Novatec Editora,
p.221, 2009.
RAUMBAUGH, J. Object-Oriented Modeling and Design. Englewood Cliffs: Prentice Hall,
1991.