Você está na página 1de 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

Jaime K. Ossada Anhanguera Educacional

jaimeossada@uol.com.br

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.

Anhanguera Educacional S.A.

Correspondência/Contato Alameda Maria Tereza, 2000 Valinhos, São Paulo CEP. 13.278-181 rc.ipade@unianhanguera.edu.br

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.

2

Mapeamento objeto relacional com Hibernate

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

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

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 SGBDs 1 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 SQL 2

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 SEQUEL 3 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

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

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

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

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

6 Mapeamento objeto relacional com Hibernate

E

ENTIDADE

RELACIONAMENTO

DE

DIAGRAMA

DIAGRAMA DE CLASSES

ra acesso a banco de dados, bem como, de instruções em DML 4 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

com o Diagrama de Classes Diagramas Considerações Pessoa tem relação 1:1 com PF e PJ e

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.

“idPessoa” é também a chave primaria nessas tabelas. classe Pessoa é abstrata, portanto não se mãe

classe Pessoa é abstrata, portanto não

se

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

transforma em objeto. Pessoa é classe

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

Benefrancis do Nascimento, Jaime K. Ossada

7

Benefrancis do Nascimento, Jaime K. Ossada 7 Figura 1 - Comparação entre instrução SQL e HQL

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

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- rantir o relacionamento entre duas classes / tabelas.

de relacionamento”, unique=”true ou

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

1:1 @Entity Public class Pessoa{ @OneToOne

@Entity Public class Pessoa{ @OneToOne

Private Telefone telefone;

}

1:N

1:N @Entity Public class Pessoa{ @OneToMany

@Entity Public class Pessoa{ @OneToMany

Private Collection<Telefone> telefones;

}

N:1

N:1 @Entity Public class Telefone{ @ManyToOne Private Pessoa pessoa;

@Entity Public class Telefone{ @ManyToOne Private Pessoa pessoa;

}

Benefrancis do Nascimento, Jaime K. Ossada 9

Benefrancis do Nascimento, Jaime K. Ossada

9

N:N @Entity Public class Pessoa{ @ManyToMany Private Collection<Telefone> telefones; } @Entity Public class
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 Public class Pessoa{ @Embeddable

Private Telefone telefone; String nome;

Embutidas

Embutidas

}

 

@Embeddable Public class Telefone{ Private int ddd;

Private String numero;

}

Chaves Compostas

 

@Entity

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

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

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

@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 {

 

}

1

Tabela

1 Tabela @Entity @Inheritance(strategy=Inheri tanceType.SINGLE_TABLE) @DiscriminatorColumn(name="tipo") public

@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-

1 tabela por clas- @Entity @Inheritance(strategy=Inheri tanceType.TABLE_PER_CLASS) public abstract class Pesso{ }

@Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public abstract class Pesso{

}

se

 

@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 1 1

Benefrancis do Nascimento, Jaime K. Ossada

11

Ide Netbeans 6.8 completo (já vem com o framework hibernate embu- tido) 5 ;

Banco de dados Mysql 6 ;

Mysql-connector-java-5.1.6-bin.jar ou versão superior 7

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:

respectivos telefones. Abaixo nosso diagrama de classes: Figura 2 - Diagrama de Classes 5. IMPLEMENTAÇÃO

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 HeidiSQL 8 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

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.

o preenchimento clique em “OK” e depois em finalizar. Figura 3 - Informando ao Hibernate qua

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 1 3

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.

algumas ou- tras propriedades, porém são opcionais. Figura 4 - Conteúdo do arquivo hibernate.cfg.xml Este

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

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.

Para o programador basta apenas dizer qual dialeto a usar. Informamos qual a classe do driver

Informamos qual a classe do driver que iremos utilizar.

Informamos qual a classe do driver que iremos utilizar. Definimos qual a String de conexão. Passamos

Definimos qual a String de conexão.

qual a classe do driver que iremos utilizar. Definimos qual a String de conexão. Passamos qual

Passamos qual o usuário e senha

14

Mapeamento objeto relacional com Hibernate

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.

apaga colunas, somente insere novas se for ne- cessário. Informamos ao hibernate quais as classes que

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 1 5

Benefrancis do Nascimento, Jaime K. Ossada

15

Benefrancis do Nascimento, Jaime K. Ossada 1 5 Figura 5 - Criando classe java no Netbeans

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

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

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 manipul ação de dados utilizando hibernate:

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

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

16 Mapeamento objeto relacional com Hibernate
16 Mapeamento objeto relacional com Hibernate Figura 6 - Encapsulando campos

Figura 6 - Encapsulando campos

Benefrancis do Nascimento, Jaime K. Ossada 1 7

Benefrancis do Nascimento, Jaime K. Ossada

17

5.3. Pacote br.com.ORM.bean

Pessoa.java

K. Ossada 1 7 5.3. Pacote br.com.ORM.bean Pessoa.java Figura 7 - Conteúdo da classe Pessoa Acabamos

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

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

@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

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

@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

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.

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

PF.java

relacionamento entre pessoa e telefone do tipo 1:N. PF.java Figura 8 - Conteúdo da classe PF

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

. Não se esqueça de encapsular o atributo cpf. PJ.java Figura 9 - Conteúdo da classe

Figura 9 - Conteúdo da classe PJ

classe

@DiscriminatorValue que nesta classe é “PJ” e no tamanho do campo CNPJ que aqui é igual a 18.

PF apenas no valor da anotação

A

classe

PJ

se

difere

da

Benefrancis do Nascimento, Jaime K. Ossada 1 9

Benefrancis do Nascimento, Jaime K. Ossada

19

Telefone.java

do Nascimento, Jaime K. Ossada 1 9 Telefone.java Figura 10 - Classe Telefone A anotação @JoinColunm

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

20 Mapeamento objeto relacional com Hibernate

ConexaoHibernate.java

objeto relacional com Hibernate ConexaoHibernate.java Figura 11 - Classe ConexaoHibernate 5.5. Pacote

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 2 1

Benefrancis do Nascimento, Jaime K. Ossada

21

PessoaDAO.java

Benefrancis do Nascimento, Jaime K. Ossada 2 1 PessoaDAO.java Figura 12 - Classe PessoaDAO

Figura 12 - Classe PessoaDAO

22

Mapeamento objeto relacional com Hibernate

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

Consultar (veja a assinatura dos métodos). TelefoneDAO.java Figura 13 - Classe TelefoneDAO Repare que o método

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 2 3

Benefrancis do Nascimento, Jaime K. Ossada

23

Persistir();

main(String[] args)

K. Ossada 2 3  Persistir();  main(String[] args) Figura 14 - Conteúdo da classe Inicio

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

e sal-

construtor 9 , criamos uma lista de telefones e, em seguida, associamos à pessoa

9 lembre-se que deverá criar métodos construtores nas classes do pacote br.com.ORM.bean

24

Mapeamento objeto relacional com Hibernate

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.

Começaremos então consultando pessoa pelo nome. Figura 15- Consultando pessoas pelo nome Tendo este código

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-

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.

A

sessão cria uma query no padrão HQL que espera pelo parâmetro nome.

Configuramos aqui o parâmetro nome.

Configuramos aqui o parâmetro nome.

Benefrancis do Nascimento, Jaime K. Ossada 2 5

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:

no banco de dados. Veja abaixo como é simples o código: Figura 16 - Método Atualizar

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:

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

Figura 17 - Método Deletar

26

Mapeamento objeto relacional com Hibernate

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 2 7

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.