artigo mapeamento objeto relacional com hibernate [benefrancis do nascimento ]
DESCRIPTION
MAPEAMENTO OBJETO RELACIONAL COM HIBERNATEUtilizando anotações hibernate em programação orientada a objetos com Java.Benefrancis do Nascimento Anhanguera [email protected]TRANSCRIPT
1
Benefrancis do Nascimento
Anhanguera Educacional [email protected]
Jaime K. Ossada
Anhanguera Educacional [email protected]
MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE
Utilizando anotações hibernate em programação orientada a objetos com Java.
RESUMO
É crescente a adoção da orientação a objetos como paradigma para o desenvolvimento de softwares, entretanto grande parte das em-presas mantém o uso de bancos de dados relacionais. Resistindo, 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 that has been created the Hibernate framework and other map-makers relational object. We will discuss in this article object rela-tional mapping using JPA annotations and Hibernate framework in Java classes. We will finish this article by developing a simple application that exemplify the main features of object relational mapping.
Keywords: Java, hibernate, database, mapping, JPA.
Anhanguera Educacional S.A.
Correspondência/Contato Alameda Maria Tereza, 2000 Valinhos, São Paulo CEP. 13.278-181 [email protected]
Mapeamento objeto relacional com Hibernate 2
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.
Mapeamento objeto relacional com Hibernate 4
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-
Mapeamento objeto relacional com Hibernate 6
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
DIA
GR
AM
A
DE
E
NT
IDA
DE
E
RE
LA
CIO
NA
ME
NT
O
Pessoa tem relação 1:1 com PF e PJ e 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 estrangeira denominada “idPessoa” é também a chave primaria nessas tabelas.
DIA
GR
AM
A D
E C
LA
SSE
S
A classe Pessoa é abstrata, portanto não 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
Mapeamento objeto relacional com Hibernate 8
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 de relacionamento”, unique=”true ou false”)
Definimos aqui os parâmetros de colunas utilizadas para ga-rantir o relacionamento entre duas classes / tabelas.
@JoinTable(name=”pessoa_telefone”,
JoinColumns={
@JoinColumn(name=”ref_pessoa_id”)
},
inverseJoinColumns={
@JoinColumn(name=”ref_telefone_id”)
})
Definimos os parâmetros para realizar o relacionamento entre duas classes / tabelas.
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
Embutidas
@Entity
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:
Mapeamento objeto relacional com Hibernate 10
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
Junção @Entity
@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 {
}
1 Tabela
@Entity
@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 {
}
1 tabela por clas-se
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
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
Mapeamento objeto relacional com Hibernate 12
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
Mapeamento objeto relacional com Hibernate 14
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:
Mapeamento objeto relacional com Hibernate 16
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
Mapeamento objeto relacional com Hibernate 18
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.
Mapeamento objeto relacional com Hibernate 20
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
Mapeamento objeto relacional com Hibernate 22
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
Mapeamento objeto relacional com Hibernate 24
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
Mapeamento objeto relacional com Hibernate 26
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:
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.