artigo mapeamento objeto relacional com hibernate [benefrancis do nascimento ]

27
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]

Upload: benefrancis

Post on 25-Jun-2015

2.428 views

Category:

Documents


3 download

DESCRIPTION

MAPEAMENTO OBJETO RELACIONAL COM HIBERNATEUtilizando anotações hibernate em programação orientada a objetos com Java.Benefrancis do Nascimento Anhanguera [email protected]

TRANSCRIPT

Page 1: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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]

Page 2: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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:

Page 3: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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.

Page 4: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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)

Page 5: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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-

Page 6: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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.

Page 7: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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

Page 8: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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; 

Page 9: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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:

Page 10: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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:

Page 11: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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

Page 12: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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

Page 13: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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

Page 14: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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:

Page 15: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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:

Page 16: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

Mapeamento objeto relacional com Hibernate 16

Figura 6 - Encapsulando campos

Page 17: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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

Page 18: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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.

Page 19: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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.

Page 20: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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.

Page 21: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

Benefrancis do Nascimento, Jaime K. Ossada

21

PessoaDAO.java

Figura 12 - Classe PessoaDAO

Page 22: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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();

Page 23: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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

Page 24: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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.

Page 25: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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

Page 26: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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:

[email protected]

[email protected]

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.

Page 27: Artigo MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE  [Benefrancis do Nascimento ]

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.