Anda di halaman 1dari 27

MAPEAMENTO OBJETO RELACIONAL COM

HIBERNATE

Utilizando anotações hibernate em programação


orientada a objetos com Java.

Benefrancis do Nascimento
Anhanguera Educacional
benefrancis@gmail.com
RESUMO

Jaime K. Ossada É crescente a adoção da orientação a objetos como paradigma para


Anhanguera Educacional o desenvolvimento de softwares, entretanto grande parte das em-
presas mantém o uso de bancos de dados relacionais. Resistindo,
jaimeossada@uol.com.br
por diversos motivos, a migrar para bancos de dados orientados a
objetos. Sabemos que manter programação orientada a objeto per-
sistindo dados em bancos de dados relacionais faz com que o de-
senvolvedor tenha que programar pensando em dois paradigmas
e em diversas características da implementação, pelos sistemas
gerenciadores de banco de dados, da SQL. Daí nasceu à necessi-
dade de criar uma interface na qual fosse possível persistir dados
como se fossem objetos. Basicamente para atender a essa necessi-
dade que foi criado o framework Hibernate e outros mapeadores
objeto relacional. Abordaremos neste artigo o mapeamento objeto
relacional utilizando anotações JPA e o framework hibernate em
classes Java. Concluiremos este artigo desenvolvendo uma aplica-
ção simples que exemplificará as principais características do ma-
peamento objeto relacional.

Palavras-Chave: Java, hibernate, banco, dados, mapeamento, JPA.

ABSTRACT

Is growing adoption of object orientation as paradigm for software


development, however most of keeps using relational databases.
Resisting, for various reasons to migrate to databases object. We
know that maintaining object-oriented programming persisting
data in relational databases causes the developer from having to
schedule considering two paradigms and various characteristics
of the implementation, by the systems database managers, SQL.
Hence was born the need to create an interface in which you could
persist data as if they were objects. Basically to address this need
Anhanguera Educacional S.A. that has been created the Hibernate framework and other map-
Correspondência/Contato makers relational object. We will discuss in this article object rela-
Alameda Maria Tereza, 2000 tional mapping using JPA annotations and Hibernate framework
Valinhos, São Paulo
CEP. 13.278-181 in Java classes. We will finish this article by developing a simple
rc.ipade@unianhanguera.edu.br application that exemplify the main features of object relational
mapping.

Keywords: Java, hibernate, database, mapping, JPA.

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:

 definir conceito de persistência;


 trabalhar com o framework hibernate;
 configurar um ambiente para desenvolvimento de aplicação Java para
web utilizando o framework hibernate;
 mapear classes utilizando a JPA;
 gerar a estrutura de tabelas em um banco de dados relacional que refli-
ta as classes mapeadas de uma aplicação orientada a objetos;
 persistir objetos em bancos de dados relacionais e manipulá-los;

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:

 Principais conceitos sobre programação orientada a objeto;


 Persistência;
 Banco de dados estruturais e a SQL;

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.

2.1. Programação orientada a objetos (POO)

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

Objetos são unidades de programas que, basicamente:


Benefrancis do Nascimento, Jaime K. Ossada 3

 contém um estado em geral invisível ao exterior;


 contém métodos (algoritmos) que mudam o estado do objeto;
 fornecem uma interface que expõe métodos e, eventualmente, compo-
nentes do estado;
 são organizados em hierarquia de classes.

Objetos são criados a partir de classes. A classe é a representação de um con-


junto de objetos reconhecidos por compartilhar as mesmas características de atributos,
operações, relações e semântica.

Ao particionar um programa, o paradigma OO oferece uma vantagem em re-


lação ao uso de módulos, conhecida como information hiding, encapsulamento ou ocul-
tação de informação (pode-se utilizar um objeto sem conhecer sua construção interna).
Isso permite que programadores trabalhem em equipe provendo cada um as interfaces
que os demais devem utilizar. Se as interfaces estiverem rigorosamente bem definidas
e implementadas, a integração dos diversos componentes terá grande chance de suces-
so.

O encapsulamento aumenta as possibilidades de reuso. Por exemplo, se em


um sistema é criado um objeto cliente, contendo dados cadastrais e métodos como gra-
var e atualizar, tal objeto poderá ser reaproveitado nos projetos seguintes que também
referenciem clientes.

Koscianski et. al. (2007) definiram que “O mecanismo de herança permite o


reuso de código. Além de herdar os atributos e métodos originais, a nova classe – co-
nhecida como filha, derivada ou subclasse – pode acrescentar novas características, es-
tendendo as funcionalidades da superclasse original”.

Em uma linguagem de programação a comunicação entre objetos é feita por


chamada de métodos cada método possui uma assinatura que corresponde ao nome do
método e os tipos dos parâmetros que ele recebe. Observe que num método podemos
passar como parâmetro outros objetos e se o objeto passado for do tipo da super classe
o método acionado será o da classe ancestral. E a isso damos o nome de polimorfismo.

Em nosso projeto utilizaremos Java como linguagem de programação orienta-


da a objetos, porém o hibernate pode ser utilizado em aplicações .NET.
4 Mapeamento objeto relacional com Hibernate

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.

2.3. Banco de dados estruturados e a SQL

Nos anos 60 os dados de uma aplicação eram mantidos aleatoriamente em arquivos,


que muitas vezes faziam parte da aplicação. Foi nessa época que surgiram os primeiros
SGBDs1 comerciais que traziam como novidade o armazenamento de dados indepen-
dente da aplicação, mas não possuíam ferramentas eficientes de acesso a esses dados.

Codd (1970) propôs a criação de linguagens de alto nível, permitindo manipu-


lação eficiente. Foi daí o início da criação da SQL2

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

A primeira implementação da linguagem SEQUEL3 foi realizada pela IBM e


tinha por objetivo a implementação do modelo de Codd. A evolução desta linguagem
veio a dar origem à SQL.

A primeira implementação comercial da SQL foi realizada pela Relational Sof-


tware, Inc., hoje conhecida por Oracle Corporation.

Nos dias de hoje, a linguagem SQL é considerada um standard dos Sistemas de


Gestão de Base de Dados Relacionais (SGBDR); por isso, todos os fabricantes a inte-
gram nos seu produtos, porém todos os bancos de dados possuem um grupo específico
de características e limitações. Para lidar com essa realidade o desenvolvedor acaba
perdendo um precioso tempo.

1 SGBDs: Sistema de Gestão de Base de Dados


2
Structured Query Language, ou Linguagem de Consulta Estruturada ou SQL, é uma linguagem de pesquisa declarativa para banco
de dados relacional (base de dados relacional).
3
SEQUEL, acrônimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Inglês)
Benefrancis do Nascimento, Jaime K. Ossada 5

3. MAPEAMENTO OBJETO RELACIONAL

À 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).

Tabela 1 - Comparação entre as mais utilizadas técnicas para persistência de objetos


Técnica Descrição
Persistindo objetos em banco de dados relacional utilizando a
JDBC permite que os programadores espalhem código SQL nas
classes e, ao utilizar esta técnica, os atributos das classes são
espalhados pelas tabelas no banco de dados. Torna a programa-
ção mais trabalhosa e de difícil manutenção.

Persistir em bancos de dados orientados ao objeto é o cenário


ideal, pois o programador trabalha seguindo apenas um para-
digma. Torna o sistema mais simples para manutenção, porque
os objetos serão refletidos no banco de dados e organizados
com o uma coleção. Para Chaudri & Zicari (2001) uma base de
dados orientada a objetos é apenas uma coleção de objetos,
enquanto em um sistema orientado a objetos, cada objeto repre-
senta cada entidade do mundo real.

Persistir utilizando framework Hibernate permite ao programa-


dor desenvolver o sistema pensando somente em um paradig-
ma, porém é importante ter noção sobre normalização de banco
de dados relacional para desenvolver software de boa qualida-
de. Esta técnica livra o programador de ter que lidar com carac-
terísticas diferentes entre os bancos de dados relacionais. Torna
o software de fácil manutenção e com portabilidade para qual-
quer SGBDR. Bastando para isso modificar apenas o dialeto no
arquivo hibernate.cfg.xml. Muitas pessoas têm receio de utili-
zar framework, pois temem que o projeto seja descontinuado,
porém ao utilizar um ORM que implemente a JPA torna uma
possível migração para outro framework uma tarefa de baixa
complexidade porque não será necessário ter que mapear todas
as propriedades das classes, uma vez que as classes fazem im-
port de javax.persistence.* (JPA) para a maioria das anotações.

3.1. Hibernate e a HQL

O Hibernate é uma ferramenta para mapeamento objeto relacional largamente utiliza-


da por desenvolvedores Java e .NET. O hibernate transforma os dados tabulares de um
banco de dados em estruturas de objetos definidos pelo desenvolvedor. O uso do hi-
bernate faz com que o desenvolvedor se livre de escrever diversas linhas de código pa-
6 Mapeamento objeto relacional com Hibernate

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.

Para eficácia do seu projeto de mapeamento é necessário analisar o diagrama


de entidade e relacionamento (DER) e o diagrama de classes, pois eles devem refletir
logicamente a aplicação que será desenvolvida.

Tabela 2 - Diagrama de Entidades e Relacionamentos comparado com o Diagrama de Classes


Diagramas Considerações
Pessoa tem relação 1:1 com PF e PJ e
E
ENTIDADE

relação 1:N com telefone. Desta forma,


uma pessoa pode ser PF ou PJ em nosso
sistema. Repare que em PF e PJ a chave
RELACIONAMENTO

estrangeira denominada “idPessoa” é


DE

também a chave primaria nessas tabelas.


DIAGRAMA

A classe Pessoa é abstrata, portanto não


DIAGRAMA DE CLASSES

se transforma em objeto. Pessoa é classe


mãe de PF e PJ, desta forma as classes
filhas herdam as propriedades, métodos e
associações da classe Pessoa. Uma pessoa
poderá possuir vários telefones, mas um
telefone não faria sentido em nossa apli-
cação sem uma pessoa.

A HQL é a linguagem utilizada para consulta no hibernate. As instruções em


HQL têm como objetivo retornar objetos enquanto que as instruções em SQL retornam
a linhas e colunas de uma ou mais tabelas.

A figura 3 compara as instruções SQL e HQL que retornam todas as pessoas


físicas cujo telefone tenha o DDD igual a 11.

4
DML: linguagem de manipulação de dados utilizada nos SGBDs.
Benefrancis do Nascimento, Jaime K. Ossada 7

Figura 1 - Comparação entre instrução SQL e HQL

Não é obrigatório o comando “SELECT” na instrução HQL, pois em HQL não


necessitamos informar os atributos que desejamos obter como resposta, uma vez que o
objetivo é retornar objetos do tipo definido no comando “FROM”.

3.2. Anotações utilizando o padrão Java Persistence API (JPA)

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

Tabela 3- As principais anotações do JPA


Anotação Descrição
@Entity Declara a classe como persistente.
@Table Define qual a tabela utilizada para armazenar os valores da
classe. Não é obrigatório se a tabela tiver o mesmo nome da
classe.
@Id Define a propriedade que é a chave primária da classe/tabela.
Esta anotação é obrigatória.
@Trasiente Define que uma determinada propriedade da classe não é per-
sistente, portanto não terá uma coluna na tabela.
@Basic Define a estratégia de fetch para uma propriedade de uma
classe (lazy, por exemplo).
@Temporal Define que a propriedade é do tipo data (Temporal-
Type.DATE), hora (TemporalType.TIME) ou data/hora
(TemporalType.DATE-TIME).
@Enumerated Define a propriedade de uma classe como do tipo enumerado.
@Lob Define a propriedade como de um tipo binário ou maior que
255 caracteres.
@Version Permite declarar uma propriedade para controlar lock otimista.
@Column(name=”nome_coluna”, nul- Permite especificar qual a coluna de banco de dados utilizada
8 Mapeamento objeto relacional com Hibernate

lable=”true ou false”, lenght=”20”) para armazenar o valor de uma propriedade.


@GeneratedValue Utilizamos juntamente com @Id para determinar a estratégia
de geração do Id.
@JoinColumn(name=”nome da coluna Definimos aqui os parâmetros de colunas utilizadas para ga-
de relacionamento”, unique=”true ou rantir o relacionamento entre duas classes / tabelas.
false”)
@JoinTable(name=”pessoa_telefone”, Definimos os parâmetros para realizar o relacionamento entre
duas classes / tabelas.
JoinColumns={
@JoinColumn(name=”ref_pessoa_id”)
},
inverseJoinColumns={
@JoinColumn(name=”ref_telefone_id”
)
})

Mapeando associações (uma classe por tabela)

Abaixo apresentaremos as opções disponíveis para mapeamento de associações com


JPA em que uma classe representará uma tabela no banco de dados.

Tabela 4 - Mapeando associações (uma classe por tabela)


Relacionamento DER Código Java
1:1 @Entity 
Public class Pessoa{ 
@OneToOne 
Private Telefone telefone; 

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; 

Mapeando associações (mais de uma classe por tabela)

Abaixo apresentaremos as opções disponíveis para mapeamento de associações com


JPA em que mais de uma classe representará uma tabela no banco de dados.

Tabela 5 - Mapeando associações (mais de uma classe por tabela)


Relacionamento Diagrama Código Java
Classes @Entity 

Embutidas Public class Pessoa{ 
@Embeddable 
Private Telefone telefone; 
String nome; 

@Embeddable 
Public class Telefone{ 
Private int ddd; 
Private String numero; 
}

Chaves Compostas @Entity 


public class Pessoa{ 
@EmbeddableId 
Private rg; 
String nome; 

@Embeddable 
Public class Rg{ 
String rg; 
String ufRg; 
}

Mapeando Herança

Abaixo apresentaremos as opções disponíveis para mapeamento de heranças. Temos


três estratégias:
10 Mapeamento objeto relacional com Hibernate

 Junção de tabelas (Joined);


 Tudo em uma tabela (Single Table);
 Uma tabela por classe (Table per Class).

Tabela 6 - Estratégias para mapeamento de herança


Estratégia Diagrama Código Java
@Entity
Junção
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="tipo") 
public abstract class Pessoa{ 

@Entity 
@Inheritance(strategy= InheritanceType.JOINED) 
@DiscriminatorValue("PF") 
public class PF extends Pessoa { 

@Entity 
@Inheritance(strategy= InheritanceType.JOINED) 
@DiscriminatorValue("PJ") 
public class PJ extends Pessoa { 

@Entity
1 Tabela
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="tipo") 
public abstract class Pessoa{ 

@Entity 
@DiscriminatorValue("PF") 
public class PF extends Pessoa { 

@Entity 
@DiscriminatorValue("PJ") 
public class PJ extends Pessoa { 

@Entity
1 tabela por clas-
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
se
public abstract class Pesso{ 

@Entity 
public class PF extends Pessoa { 

@Entity 
public class PJ extends Pessoa { 

4. ESTUDO DE CASO

Efetuaremos a persistência de objetos de uma aplicação Java que implementa o dia-


grama de classes exibido na figura 3.

Para desenvolvimento do nosso estudo de caso efetuamos o download dos se-


guintes programas:
Benefrancis do Nascimento, Jaime K. Ossada 11

 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

4.1. SITUAÇÃO PROBLEMA

Desenvolveremos uma aplicação que deverá permitir cadastrar, consultar e excluir


pessoas físicas e jurídicas e seus respectivos telefones.

Abaixo nosso diagrama de classes:

Figura 2 - Diagrama de Classes

5. IMPLEMENTAÇÃO UTILIZANDO MAPEAMENTO OBJETO RELACIONAL

Iniciaremos agora a implementação utilizando mapeamento objeto relacional com ano-


tações em nossas classes.

5.1. Configurando o ambiente de desenvolvimento

Programaremos a nossa aplicação utilizando o ide Netbeans. Porém antes de iniciar-


mos a codificação das classes descritas no diagrama da figura 3, precisamos configurar
nosso ambiente de desenvolvimento.

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:

Abra o Netbeans, vá até o menu: “Arquivo”>”Novo Projeto”.

Na janela que será aberta é o local onde será configurado nosso ambiente. Para confi-
guração deverá seguir os quatro passos, conforme segue:

1. Escolha o projeto: selecione a categoria Java/Web – Aplicação Web em seguida clique


em próximo;

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;

4. Frameworks: Selecione apenas o hibernate. A versão que utilizamos é a 3.2.5. em cone-


xão de banco de dados selecione nova conexão com banco de dados. Aparecerá a tela
abaixo na qual deverá ser escolhido o MySql (Connector/J driver) e demais parâmetros
conforme imagem abaixo, porém host, porta, usuário e senha podem não ser os mes-
mos em seu ambiente. Após o preenchimento clique em “OK” e depois em finalizar.

Figura 3 - Informando ao Hibernate qual o banco de dados que utilizaremos

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.

Figura 4 - Conteúdo do arquivo hibernate.cfg.xml

Este arquivo em alguns sistemas poderá não existir, porém em seu lugar deve-
rá existir um arquivo “hibernate.properties”.

Tabela 7 - Descrevendo o conteúdo do arquivo de configuração do hibernate

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.

Informamos qual a classe do driver que iremos utilizar.

Definimos qual a String de conexão.

Passamos qual o usuário e senha


14 Mapeamento objeto relacional com Hibernate

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.

Informamos ao hibernate quais as classes que serão mapeadas.

Em sistemas mais antigos, antes da criação do “hibernate-annotations.jar”,


disponível na biblioteca da nossa aplicação, o mapeamento também era realizado em
arquivos XML, portanto caso efetue manutenção em sistemas mais antigos você poderá
se deparar com mapeamentos de classes no arquivo “hibernate.cfg.xml”ou em outros
arquivos XML, porém esta já não é uma boa prática, pois deixa a aplicação com códigos
muito espalhados.

Agora que já estamos com nosso ambiente de desenvolvimento configurado,


passaremos para a fase de codificação, pois nosso ambiente já esta apto para processar
as nossas classes em Java incluindo anotações hibernate. Explicaremos essas anotações
conforme formos utilizando.

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

Figura 5 - Criando classe java no Netbeans

Criaremos classes com nome e pacote conforme descrição contida na tabela abaixo:

Tabela 8 - Pacotes da nossa aplicação


Pacote Descrição e conteúdo
Neste pacote criaremos os arquivos java beans contendo anotações para
persistência. Com os nomes a seguir:
1º. Pessoa.java;
2º. PF.java;
3º. PJ.java;
4º. Telefone.java
Neste pacote criaremos o arquivo “ConexaoHibernate.java”. Responsá-
vel pela coleta das informações do arquivo de configuração, conexão
com base de dados e pelo retorno da sessão desta conexão.
Criaremos os arquivos para manipulação de dados utilizando hibernate:
1º. PessoaDAO.java;
2º. TelefoneDAO.java
Neste pacote criaremos a classe “inicio.java”. classe responsável pelo
método main (ponto de partida da aplicação).

A seguir exibiremos o conteúdo de cada arquivo contendo nossas observações.


Os métodos para acesso aos atributos dos objetos encapsulados (getters and setters) fo-
ram omitidos para economizar espaço neste material, porém para criá-los basta, após
digitar o conteúdo das imagens a seguir, ir ao menu “Refatorar” > ”Encapsular cam-
pos”. O Netbeans abrirá uma janela semelhante a que exibiremos na figura abaixo:
16 Mapeamento objeto relacional com Hibernate

Figura 6 - Encapsulando campos


Benefrancis do Nascimento, Jaime K. Ossada 17

5.3. Pacote br.com.ORM.bean

Pessoa.java

Figura 7 - Conteúdo da classe Pessoa

Acabamos de codificar a classe pessoa, logo abaixo comentaremos os pontos


mais importantes que nela contém.

Tabela 9 - Comentários sobre o mapeamento da classe Pessoa


Ponto Descrição
Quando digitamos @Entity, o hibernate oferece duas classes para importação. Quando estiver
mapeando a classe, prefira importar de javax.persistence.*, pois desta forma seu mapeamento
ficará independente de framework. Entretanto repare que a anotação @Cascade necessita que o
importe seja de org.hibernate.annotations.*.
@Inheritance(strategy = InheritanceType.JOINED): Estamos dizendo que a herança está ou
será representada em base de dados com tabelas relacionadas. Ou seja, existe uma tabela para a
classe mãe e outra para classe filha.
@DiscriminatorColumn(name = “tipo”): Quando a herança possui estratégia igual a Inheri-
tanceType.JOINED, é preciso informar qual a coluna que discrimina o tipo. No nosso caso é
preciso informar para a tabela pessoa qual o tipo da pessoa que estamos cadastrando.
Informamos qual é a chave primária da tabela e qual o esquema utilizado para gerar a chave.
No nosso caso o esquema utilizado é automático. (auto incremento).
@Colum: Informo o nome da coluna em nossa tabela no banco de dados. Caso essa tag for
omitida o hibernate considera que a coluna tem o mesmo nome da propriedade da classe. O
parâmetro nullable = false diz ao hibernate que o campo é not null. Já o parâmetro lenght = 2
18 Mapeamento objeto relacional com Hibernate

significa que o campo tem tamanho igual a 2.


@OneToMany: Informa que existe relacionamento entre pessoa e telefone do tipo 1:N.

PF.java

Figura 8 - Conteúdo da classe PF

Na classe pessoa cabe observar a anotação @DiscriminatorValue que em nossa


aplicação é “PF” esta anotação é obrigatória quando escolhemos a estratégia de heran-
ça do tipo JOINED. Não se esqueça de encapsular o atributo cpf.

PJ.java

Figura 9 - Conteúdo da classe PJ

A classe PJ se difere da classe PF apenas no valor da anotação


@DiscriminatorValue que nesta classe é “PJ” e no tamanho do campo CNPJ que aqui é
igual a 18.
Benefrancis do Nascimento, Jaime K. Ossada 19

Telefone.java

Figura 10 - Classe Telefone

A anotação @JoinColunm faz referência ao atributo “idPessoa”da classe Pessoa


permitindo atualização e inserção.

Antes de continuar, crie métodos construtores e verifique se encapsulou todos


os atributos das classes deste pacote.

5.4. Pacote br.com.ORM.conexao

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

Figura 11 - Classe ConexaoHibernate

5.5. Pacote br.com.ORM.hibernateDAO

Neste pacote criaremos as classes responsáveis pela persistência, consulta e manipula-


ção dos dados armazenados nas tabelas do nosso banco de dados. É uma boa pratica
separar as classes que contenham os métodos de negócio das classes que contenham
dos métodos que manipulam informações em banco de dados. Esta técnica torna o sis-
tema mais fácil para um futura manutenção.
Benefrancis do Nascimento, Jaime K. Ossada 21

PessoaDAO.java

Figura 12 - Classe PessoaDAO


22 Mapeamento objeto relacional com Hibernate

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

Figura 13 - Classe TelefoneDAO

Repare que o método salvar da classe TelefoneDAO.java é muito parecido


com o método salvar da classe PessoaDAO.java mudando apenas a assinatura que nes-
te caso espera receber um objeto Telefone. Tendo como base os outros métodos da clas-
se PessoaDAO.java.

5.6. Criando o banco de dados para persistir e manipular objetos

Criaremos as tabelas em nosso banco de dados “ORM” no SGBDR MySql utilizando o


Hibernate. Para isso criaremos a classe Inicio.java no pacote br.com.ORM.main. Nesta
classe codificaremos três métodos. São eles:

 GerarTabelas();
Benefrancis do Nascimento, Jaime K. Ossada 23

 Persistir();

 main(String[] args)

Figura 14 - Conteúdo da classe Inicio

No método GerarTabelas() acessamos as configurações de anotação das classes


que marcamos como mapeáveis no arquivo hibernate.cfg.xml e em seguida chamamos
o método create da classe SchemaExporte (classe do hibernate). Ao chamar este método o
hibernate acessa o banco de dados e cria as tabelas conforme os mapeamentos efetua-
dos, mas atenção: Caso as tabelas já existirem no banco de dados, serão apagadas e re-
criadas.

Em nosso método Persistir() criamos uma pessoa física utilizando um método


construtor9, criamos uma lista de telefones e, em seguida, associamos à pessoa e sal-

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.

5.7. Manipulando dados persistidos

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.

Começaremos então consultando pessoa pelo nome.

Figura 15- Consultando pessoas pelo nome

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.

Tabela 10 - Pontos importantes no metodo Consultar


Ponto Observação

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.

Configuramos aqui o parâmetro nome.


Benefrancis do Nascimento, Jaime K. Ossada 25

Agora abordaremos o método Atualizar. Que recebe um objeto do tipo pessoa


como parâmetro. Este método também fará parte da classe PessoaDAO.java, porém,
antes de chama-lo, é necessário consultar uma pessoa utilizando o método consultar,
alterar os dados necessários e depois utilizar este método para atualizar os dados da
pessoa no banco de dados.

Veja abaixo como é simples o código:

Figura 16 - Método Atualizar

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.

Passaremos agora para o método “Deletar”. Veja o conteúdo na figura abaixo:

Figura 17 - Método Deletar


26 Mapeamento objeto relacional com Hibernate

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

Abordamos conceitos importantes sobre o mapeamento objeto relacional com


JPA e Hibernate. Esperamos que este artigo se torne um material de grande valor aos
estudantes e desenvolvedores de sistemas. Aconselhamos que exercitem os concei-
tos aqui apresentados dando continuidade à nossa aplicação de exemplo desenvol-
vendo um sistema um pouco mais complexo. A escolha de persistir pessoas em banco
de dados foi proposital neste sentido, pois a maioria das aplicações necessita persistir
pessoas e o código fonte que construímos poderá servir como base para diversas
aplicações.

Estamos abertos a criticas e sugestões, com objetivo de alimentar o processo


de melhoria contínua de nossos artigos. O contato deverá ser estabelecido por meio
dos seguintes endereços eletrônicos:

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

Anda mungkin juga menyukai