MAPEAMENTO OBJETO RELACIONAL COM HIBERNATE

Utilizando anotações hibernate em programação orientada a objetos com Java.
Benefrancis do Nascimento Anhanguera Educacional
benefrancis@gmail.com

RESUMO
É crescente a adoção da orientação a objetos como paradigma para o desenvolvimento de softwares, entretanto grande parte das empresas 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 persistindo dados em bancos de dados relacionais faz com que o desenvolvedor 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 à necessidade de criar uma interface na qual fosse possível persistir dados como se fossem objetos. Basicamente para atender a essa necessidade 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 mapeamento objeto relacional. Palavras-Chave: Java, hibernate, banco, dados, mapeamento, JPA.

Jaime K. Ossada Anhanguera Educacional
jaimeossada@uol.com.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 mapmakers relational object. We will discuss in this article object relational 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 rc.ipade@unianhanguera.edu.br

1

2

Mapeamento objeto relacional com Hibernate

1.

INTRODUÇÃO
A maioria dos sistemas de software que têm o seu desenvolvimento iniciado atualmente (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 orientados 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 reflita 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 revisã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: decomposiçã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 particionar 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 combinando dados e comportamentos”. Objetos são unidades de programas que, basicamente:

Isso permite que programadores trabalhem em equipe provendo cada um as interfaces que os demais devem utilizar.Benefrancis do Nascimento. relações e semântica. estendendo as funcionalidades da superclasse original”. tal objeto poderá ser reaproveitado nos projetos seguintes que também referenciem clientes. a nova classe – conhecida como filha.NET. porém o hibernate pode ser utilizado em aplicações . conhecida como information hiding. se em um sistema é criado um objeto cliente. 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. operações. . E a isso damos o nome de polimorfismo. contém métodos (algoritmos) que mudam o estado do objeto. 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. (2007) definiram que “O mecanismo de herança permite o reuso de código. A classe é a representação de um conjunto de objetos reconhecidos por compartilhar as mesmas características de atributos. Ossada 3     contém um estado em geral invisível ao exterior. Por exemplo. Jaime K. Koscianski et. O encapsulamento aumenta as possibilidades de reuso. são organizados em hierarquia de classes. Em nosso projeto utilizaremos Java como linguagem de programação orientada a objetos. fornecem uma interface que expõe métodos e. derivada ou subclasse – pode acrescentar novas características. Além de herdar os atributos e métodos originais. a integração dos diversos componentes terá grande chance de sucesso. eventualmente. Objetos são criados a partir de classes. o paradigma OO oferece uma vantagem em relação ao uso de módulos. al. Ao particionar um programa. Se as interfaces estiverem rigorosamente bem definidas e implementadas. encapsulamento ou ocultação de informação (pode-se utilizar um objeto sem conhecer sua construção interna). componentes do estado. contendo dados cadastrais e métodos como gravar e atualizar.

por isso. No contexto de programação orientada a objeto. permitindo manipulação eficiente. acrônimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Inglês) . Foi nessa época que surgiram os primeiros SGBDs1 comerciais que traziam como novidade o armazenamento de dados independente da aplicação. todos os fabricantes a integram nos seu produtos. portanto deverá permitir que esses objetos não sejam voláteis. de um artigo intitulado “A Relational Model of Data for Large Shared Data Banks”. durar longo tempo ou permanecer (OGLIO. porém não são os únicos. a persistência significa a possibilidade de esses objetos serem armazenados em meio externo à aplicação. A primeira implementação da linguagem SEQUEL3 foi realizada pela IBM e tinha por objetivo a implementação do modelo de Codd.2.3. hoje conhecida por Oracle Corporation. mas não possuíam ferramentas eficientes de acesso a esses dados.4 Mapeamento objeto relacional com Hibernate 2. preservar. é uma linguagem de pesquisa declarativa para banco de dados relacional (base de dados relacional). Para lidar com essa realidade o desenvolvedor acaba perdendo um precioso tempo. A primeira implementação comercial da SQL foi realizada pela Relational Software. 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. que muitas vezes faziam parte da aplicação. 2009). O modelo proposto por Codd é hoje considerado a base de trabalho para qualquer Sistema de Gestão de Base de Dados Relacional (SGBDR). A evolução desta linguagem veio a dar origem à SQL. persistência significa continuar a existir. Inc. porém todos os bancos de dados possuem um grupo específico de características e limitações. ou Linguagem de Consulta Estruturada ou SQL. Nos dias de hoje. 3 SEQUEL. 2. no ACM Journal. Atualmente os bancos de dados relacionais são o meio mais utilizado para isso. 1 SGBDs: Sistema de Gestão de Base de Dados 2 Structured Query Language. Persistência De modo geral.. Codd (1970) propôs a criação de linguagens de alto nível. a linguagem SQL é considerada um standard dos Sistemas de Gestão de Base de Dados Relacionais (SGBDR). Banco de dados estruturados e a SQL Nos anos 60 os dados de uma aplicação eram mantidos aleatoriamente em arquivos.

xml. Ossada 5 3. ao utilizar esta técnica.Benefrancis do Nascimento.* (JPA) para a maioria das anotações. enquanto em um sistema orientado a objetos. O uso do hibernate faz com que o desenvolvedor se livre de escrever diversas linhas de código pa- . Para Chaudri & Zicari (2001) uma base de dados orientada a objetos é apenas uma coleção de objetos. os atributos das classes são espalhados pelas tabelas no banco de dados.1. Torna a programação mais trabalhosa e de difícil manutenção.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.NET. Tabela 1 . Muitas pessoas têm receio de utilizar framework. Hibernate e a HQL O Hibernate é uma ferramenta para mapeamento objeto relacional largamente utilizada por desenvolvedores Java e . 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. Bastando para isso modificar apenas o dialeto no arquivo hibernate. 3. pois o programador trabalha seguindo apenas um paradigma. Jaime K. dar-se-á o nome de mapeamento objeto relacional ou em inglês Object Relational Mapping (ORM).persistence. porém é importante ter noção sobre normalização de banco de dados relacional para desenvolver software de boa qualidade. Persistir em bancos de dados orientados ao objeto é o cenário ideal. O hibernate transforma os dados tabulares de um banco de dados em estruturas de objetos definidos pelo desenvolvedor. Torna o software de fácil manutenção e com portabilidade para qualquer SGBDR. pois temem que o projeto seja descontinuado. Persistir utilizando framework Hibernate permite ao programador desenvolver o sistema pensando somente em um paradigma. uma vez que as classes fazem import de javax. Esta técnica livra o programador de ter que lidar com características diferentes entre os bancos de dados relacionais. MAPEAMENTO OBJETO RELACIONAL À técnica de mapear os atributos e relacionamentos das classes que darão origem a objetos que serão persistidos em bancos de dados relacionais.cfg. porque os objetos serão refletidos no banco de dados e organizados com o uma coleção. Torna o sistema mais simples para manutenção. cada objeto representa cada entidade do mundo real.

mas um telefone não faria sentido em nossa aplicação sem uma pessoa. bem como. Tabela 2 . o hibernate não é indicado para sistemas em que as regras de negócio estão sob responsabilidade do banco de dados. dependendo pouco de funções específicas do banco de dados. Desta forma. uma ferramenta que acelera o desenvolvimento de software orientado a objeto que necessita trabalhar em conjunto com banco de dados relacional. É. métodos e associações da classe Pessoa. portanto. 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.Diagrama de Entidades e Relacionamentos comparado com o Diagrama de Classes Diagramas ENTIDADE E Considerações Pessoa tem relação 1:1 com PF e PJ e relação 1:N com telefone. Pessoa é classe mãe de PF e PJ. Repare que em PF e PJ a chave estrangeira denominada “idPessoa” é também a chave primaria nessas tabelas. Uma pessoa poderá possuir vários telefones. . codificadas em stored procedures ou triggers. desta forma as classes filhas herdam as propriedades. É indicado para sistemas que contam com a maior parte da lógica de negócios na própria aplicação. 4 DML: linguagem de manipulação de dados utilizada nos SGBDs. portanto não se transforma em objeto. uma pessoa pode ser PF ou PJ em nosso sistema. Ou seja. de instruções em DML4 que ele escreveria caso não utilizasse a ferramenta. 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. pois eles devem refletir logicamente a aplicação que será desenvolvida. DIAGRAMA DE CLASSES A HQL é a linguagem utilizada para consulta no hibernate.6 Mapeamento objeto relacional com Hibernate ra acesso a banco de dados. RELACIONAMENTO DIAGRAMA DE A classe Pessoa é abstrata. Para eficácia do seu projeto de mapeamento é necessário analisar o diagrama de entidade e relacionamento (DER) e o diagrama de classes.

Define que uma determinada propriedade da classe não é persistente.Comparação entre instrução SQL e HQL Não é obrigatório o comando “SELECT” na instrução HQL. por exemplo). nul- . pois em HQL não necessitamos informar os atributos que desejamos obter como resposta. hora (TemporalType. Define que a propriedade é do tipo data (TemporalType. um campo ou método) para ajudar as ferramentas entenderem como o código está sendo utilizado ou para permitir a automatização. ELLIOTT et al (2009. Define a estratégia de fetch para uma propriedade de uma classe (lazy.125) afirmaram que: “Basicamente. uma vez que o objetivo é retornar objetos do tipo definido no comando “FROM”. Esta anotação é obrigatória.Benefrancis do Nascimento. portanto não terá uma coluna na tabela. 3.DATE-TIME). A JPA define um meio de mapeamento Objeto-Relacional para objetos Java simples e comuns (POJOS). Tabela 3. Ossada 7 Figura 1 . uma anotação é uma maneira de acrescentar informações sobre uma parte do código (no mundo Java.2. geralmente uma classe. p.DATE). 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. Permite especificar qual a coluna de banco de dados utilizada @Id @Trasiente @Basic @Temporal @Enumerated @Lob @Version @Column(name=”nome_coluna”. Define a propriedade que é a chave primária da classe/tabela. Permite declarar uma propriedade para controlar lock otimista.TIME) ou data/hora (TemporalType. Não é obrigatório se a tabela tiver o mesmo nome da classe. Define qual a tabela utilizada para armazenar os valores da classe. Define a propriedade como de um tipo binário ou maior que 255 caracteres. poupando trabalho”. Jaime K.As principais anotações do JPA Anotação @Entity @Table Descrição Declara a classe como persistente. Define a propriedade de uma classe como do tipo enumerado.

JoinColumns={ @JoinColumn(name=”ref_pessoa_id”) }. inverseJoinColumns={ @JoinColumn(name=”ref_telefone_id” ) }) para armazenar o valor de uma propriedade.  }  1:N @Entity  Public class Pessoa{  @OneToMany  Private Collection<Telefone> telefones. Tabela 4 .  }  N:1 @Entity  Public class Telefone{  @ManyToOne  Private Pessoa pessoa.8 Mapeamento objeto relacional com Hibernate lable=”true ou false”.Mapeando associações (uma classe por tabela) Relacionamento 1:1 DER Código Java @Entity  Public class Pessoa{  @OneToOne  Private Telefone telefone. Definimos os parâmetros para realizar o relacionamento entre duas classes / tabelas. Definimos aqui os parâmetros de colunas utilizadas para garantir o relacionamento entre duas classes / tabelas. Utilizamos juntamente com @Id para determinar a estratégia de geração do Id. lenght=”20”) @GeneratedValue @JoinColumn(name=”nome da coluna de relacionamento”. unique=”true ou false”) @JoinTable(name=”pessoa_telefone”. 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.  }  .

Jaime K.  }  @Embeddable  Public class Rg{  String rg.  Private String numero.Benefrancis do Nascimento.Mapeando associações (mais de uma classe por tabela) Relacionamento Classes Embutidas Diagrama Código Java @Entity  Public class Pessoa{  @Embeddable  Private Telefone telefone.  String nome. Temos três estratégias: .  } Chaves Compostas @Entity  public class Pessoa{  @EmbeddableId  Private rg.  }  9 N:N 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.  String nome. Tabela 5 .  } Mapeando Herança Abaixo apresentaremos as opções disponíveis para mapeamento de heranças. Ossada @Entity  Public class Pessoa{  @ManyToMany  Private Collection<Telefone> telefones.  }  @Entity  Public class Telefone{  @ManyToMany  Private Collection<Pessoa> pessoas.  String ufRg.  }  @Embeddable  Public class Telefone{  Private int ddd.

SINGLE_TABLE)  @DiscriminatorColumn(name="tipo")  public abstract class Pessoa{  }  @Entity  @DiscriminatorValue("PF")  public class PF extends Pessoa {  }  @Entity  @DiscriminatorValue("PJ")  public class PJ extends Pessoa {  }  @Entity @Inheritance(strategy=InheritanceType.JOINED)  @DiscriminatorColumn(name="tipo")  public abstract class Pessoa{  }  @Entity  @Inheritance(strategy= InheritanceType. Tabela 6 .JOINED)  @DiscriminatorValue("PF")  public class PF extends Pessoa {  }  @Entity  @Inheritance(strategy= InheritanceType. Tudo em uma tabela (Single Table).TABLE_PER_CLASS)  public abstract class Pesso{  }  @Entity  public class PF extends Pessoa {  }  @Entity  public class PJ extends Pessoa {  }  1 Tabela 1 tabela por classe 4.10 Mapeamento objeto relacional com Hibernate    Junção de tabelas (Joined).JOINED)  @DiscriminatorValue("PJ")  public class PJ extends Pessoa {  }  @Entity @Inheritance(strategy=InheritanceType. Uma tabela por classe (Table per Class). Para desenvolvimento do nosso estudo de caso efetuamos o download dos seguintes programas: . ESTUDO DE CASO Efetuaremos a persistência de objetos de uma aplicação Java que implementa o diagrama de classes exibido na figura 3.Estratégias para mapeamento de herança Estratégia Junção Diagrama Código Java @Entity @Inheritance(strategy=InheritanceType.

mysql. Banco de dados Mysql6.1.disponível em: http://www. Jaime K.1.com . Porém antes de iniciarmos a codificação das classes descritas no diagrama da figura 3.org Disponível em: http://www.Benefrancis do Nascimento. SITUAÇÃO PROBLEMA Desenvolveremos uma aplicação que deverá permitir cadastrar. Mysql-connector-java-5. precisamos configurar nosso ambiente de desenvolvimento.1.com/downloads/mysql/ 7 Disponível em: http://www. Abaixo nosso diagrama de classes: Figura 2 . No MYSQL: Abra o banco de dados MySql e execute o comando CREATE DATABASE `ORM` poderá utilizar o HeidiSQL8 para esta tarefa ou usar o prompt de comandos.heidisql. 5 6 Disponível em: http://netbeans. IMPLEMENTAÇÃO UTILIZANDO MAPEAMENTO OBJETO RELACIONAL Iniciaremos agora a implementação utilizando mapeamento objeto relacional com anotações em nossas classes. Ossada 11    Ide Netbeans 6.mysql.6-bin. Configurando o ambiente de desenvolvimento Programaremos a nossa aplicação utilizando o ide Netbeans.Diagrama de Classes 5. 5.8 completo (já vem com o framework hibernate embutido)5.com/downloads/connector/j/ 8 Front-end grátis para banco de dados MySql .jar ou versão superior7 4. consultar e excluir pessoas físicas e jurídicas e seus respectivos telefones.

porta. 4.cfg. Na janela que será aberta é o local onde será configurado nosso ambiente. Para configuração deverá seguir os quatro passos. vá até o menu: “Arquivo”>”Novo Projeto”. 2. Após o preenchimento clique em “OK” e depois em finalizar. Escolha o projeto: selecione a categoria Java/Web – Aplicação Web em seguida clique em próximo. Versão do Java escolha Java EE 5 ou superior se for o caso.12 Mapeamento objeto relacional com Hibernate No Netbeans: Abra o Netbeans. porém host. Aparecerá a tela abaixo na qual deverá ser escolhido o MySql (Connector/J driver) e demais parâmetros conforme imagem abaixo.cfg.xml” no pacote padrão com as configurações para acessar o banco de dados MySql. Figura 3 .Informando ao Hibernate qual o banco de dados que utilizaremos O Netbeans já está apto para inicio da codificação. conforme segue: 1. em conexão de banco de dados selecione nova conexão com banco de dados. Aceite o local padrão para local e pasta do projeto. Altere o hibernate. usuário e senha podem não ser os mesmos em seu ambiente. 3. A versão que utilizamos é a 3.5. Se tudo deu certo o Netbeans criou o arquivo “hibernate. Servidor e configurações: para servidor escolha Apache Tomcat. Frameworks: Selecione apenas o hibernate. Nome e local: para o nome digite “ORM” sem as aspas.2.xml conforme figura abaixo .

Jaime K. O hibernate saberá todas as características deste SGBDR.cfg. porém em seu lugar deverá existir um arquivo “hibernate.xml Este arquivo em alguns sistemas poderá não existir.properties”. Definimos qual a String de conexão. Figura 4 . Para o programador basta apenas dizer qual dialeto a usar.Benefrancis do Nascimento. Ossada 13 para que contenha o nome das classes que serão mapeadas . Colocamos algumas outras propriedades. Passamos qual o usuário e senha . Informamos qual a classe do driver que iremos utilizar. Tabela 7 .Conteúdo do arquivo hibernate.Descrevendo o conteúdo do arquivo de configuração do hibernate Definimos o dialeto necessário para trabalhar com o MySql. porém são opcionais.

No nosso caso. pois nosso ambiente já esta apto para processar as nossas classes em Java incluindo anotações hibernate. portanto caso efetue manutenção em sistemas mais antigos você poderá se deparar com mapeamentos de classes no arquivo “hibernate. 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. É executada quando criamos o SessioFactory que veremos em breve. porém esta já não é uma boa prática. somente insere novas se for necessário.cfg. Codificação Criaremos agora nossas classes Java bean para criar uma classe basta clicar no pacote com o botão direito do mouse. Informamos ao hibernate quais as classes que serão mapeadas. Pool_size: Tamanho da nossa piscina de conexões. Format_sql: Exibirá o SQL formatado caso esteja como true. Veja imagem abaixo: . 5. selecionar “NOVO” > “Classe Java”. Hbm2dll. o mapeamento também era realizado em arquivos XML. antes da criação do “hibernate-annotations. disponível na biblioteca da nossa aplicação. Explicaremos essas anotações conforme formos utilizando. Jamais utilizar em ambiente de produção.14 Mapeamento objeto relacional com Hibernate Show_sql: Aqui coloque true caso desejar que as instruções SQL sejam exibidas no console. Em sistemas mais antigos.2. pois deixa a aplicação com códigos muito espalhados. Update: Atualiza colunas e tabelas. Agora que já estamos com nosso ambiente de desenvolvimento configurado. 3.auto: Esta ferramenta do hibernate gera o schema do banco de dados a partir das classes mapeadas. passaremos para a fase de codificação. Esta opção não apaga colunas. Create: Cria as tabelas no banco de dados. o hibernate poderá manter 10 conexões com o banco de dados.xml”ou em outros arquivos XML. Os valores possíveis são: 1.jar”.

java Neste pacote criaremos o arquivo “ConexaoHibernate. Pessoa. Jaime K.java.Criando classe java no Netbeans Criaremos classes com nome e pacote conforme descrição contida na tabela abaixo: Tabela 8 . 3º. 4º. PF. Com os nomes a seguir: 1º. conexão com base de dados e pelo retorno da sessão desta conexão. Os métodos para acesso aos atributos dos objetos encapsulados (getters and setters) foram omitidos para economizar espaço neste material.java Neste pacote criaremos a classe “inicio. Criaremos os arquivos para manipulação de dados utilizando hibernate: 1º. O Netbeans abrirá uma janela semelhante a que exibiremos na figura abaixo: . TelefoneDAO.java”. A seguir exibiremos o conteúdo de cada arquivo contendo nossas observações. classe responsável pelo método main (ponto de partida da aplicação). após digitar o conteúdo das imagens a seguir.java. Telefone. ir ao menu “Refatorar” > ”Encapsular campos”. PessoaDAO. 2º.Benefrancis do Nascimento.java.Pacotes da nossa aplicação Pacote Descrição e conteúdo Neste pacote criaremos os arquivos java beans contendo anotações para persistência.java”. PJ.java. porém para criá-los basta. 2º. Ossada 15 Figura 5 . Responsável pela coleta das informações do arquivo de configuração.

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

Conteúdo da classe Pessoa Acabamos de codificar a classe pessoa. logo abaixo comentaremos os pontos mais importantes que nela contém. O parâmetro nullable = false diz ao hibernate que o campo é not null.*. @Inheritance(strategy = InheritanceType. No nosso caso é preciso informar para a tabela pessoa qual o tipo da pessoa que estamos cadastrando. No nosso caso o esquema utilizado é automático.bean Pessoa. Quando estiver mapeando a classe. Pacote br. Jaime K.Comentários sobre o mapeamento da classe Pessoa Ponto Descrição Quando digitamos @Entity. Informamos qual é a chave primária da tabela e qual o esquema utilizado para gerar a chave.annotations.3. @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. Já o parâmetro lenght = 2 . Entretanto repare que a anotação @Cascade necessita que o importe seja de org. prefira importar de javax.java Figura 7 . (auto incremento). o hibernate oferece duas classes para importação. existe uma tabela para a classe mãe e outra para classe filha.com.persistence. Ossada 17 5. @DiscriminatorColumn(name = “tipo”): Quando a herança possui estratégia igual a InheritanceType.hibernate.JOINED): Estamos dizendo que a herança está ou será representada em base de dados com tabelas relacionadas. é preciso informar qual a coluna que discrimina o tipo.*. Tabela 9 .Benefrancis do Nascimento.ORM. Ou seja.JOINED. pois desta forma seu mapeamento ficará independente de framework.

java Figura 8 . Não se esqueça de encapsular o atributo cpf. PJ.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. .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.java Figura 9 . PF.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.

Classe Telefone A anotação @JoinColunm faz referência ao atributo “idPessoa”da classe Pessoa permitindo atualização e inserção.Benefrancis do Nascimento. Jaime K.java Figura 10 . .ORM.com.4. crie métodos construtores e verifique se encapsulou todos os atributos das classes deste pacote.conexao Iniciaremos agora a codificação da classe que será responsável pela conexão com o hibernate e retorno da sessão desta conexão. Antes de continuar. Pacote br. Ossada 19 Telefone. 5.

consulta e manipulação dos dados armazenados nas tabelas do nosso banco de dados. Pacote br. .5.com.Classe ConexaoHibernate 5.java Figura 11 .hibernateDAO Neste pacote criaremos as classes responsáveis pela persistência.ORM. É 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 sistema mais fácil para um futura manutenção.20 Mapeamento objeto relacional com Hibernate ConexaoHibernate.

Benefrancis do Nascimento. Ossada 21 PessoaDAO.Classe PessoaDAO . Jaime K.java Figura 12 .

Nesta classe codificaremos três métodos.22 Mapeamento objeto relacional com Hibernate Para salvar uma pessoa no banco de dados utilizaremos polimorfismo.java Figura 13 .java é muito parecido com o método salvar da classe PessoaDAO.ORM. São eles:  GerarTabelas().main. Para isso criaremos a classe Inicio. .Classe TelefoneDAO Repare que o método salvar da classe TelefoneDAO. 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.java. Repare que no método salvar o parâmetro esperado é do tipo Pessoa.com. TelefoneDAO. 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). Tendo como base os outros métodos da classe PessoaDAO. entretanto se enviarmos uma PF ou PJ as informações serão salvas corretamente nas tabelas do banco de dados.java mudando apenas a assinatura que neste caso espera receber um objeto Telefone.java no pacote br.

Em nosso método Persistir() criamos uma pessoa física utilizando um método construtor9. em seguida. mas atenção: Caso as tabelas já existirem no banco de dados. main(String[] args) Figura 14 . Ossada 23   Persistir().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.Benefrancis do Nascimento.ORM. Ao chamar este método o hibernate acessa o banco de dados e cria as tabelas conforme os mapeamentos efetuados. criamos uma lista de telefones e.bean . associamos à pessoa e sal- 9 lembre-se que deverá criar métodos construtores nas classes do pacote br.xml e em seguida chamamos o método create da classe SchemaExporte (classe do hibernate). serão apagadas e recriadas.cfg.com. Jaime K.

7. Logo em seguida criamos uma pessoa jurídica adicionamos mais um telefone à lista de telefones. 5. associamos à lista de telefones à pessoa jurídica e chamamos o método Salvar.hibernateDAO. Manipulando dados persistidos Faremos agora três métodos para exemplificar como consultar. Configuramos aqui o parâmetro nome. O retorno será uma lista de pessoas.Pontos importantes no metodo Consultar Ponto Observação O método recebe como parâmetro uma String que deverá ser o nome da pessoa que se deseja consultar .Consultando pessoas pelo nome Tendo este código como base.ORM. bastando apenas mudar os parâmetros. Abaixo comentaremos os pontos mais relevantes do método consultar. fica fácil codificar consultas (lembre-se de usar a sobrecarga de métodos). a query HQL e o tipo de retorno conforme a situação. Começaremos então consultando pessoa pelo nome.java que se encontra no pacote br.24 Mapeamento objeto relacional com Hibernate vamos no banco de dados. alterar e apagar objetos persistidos.com. Tabela 10 . Figura 15. Esses métodos deverão ser incluídos na classe PessoaDAO. A sessão cria uma query no padrão HQL que espera pelo parâmetro nome. .

Veja o conteúdo na figura abaixo: Figura 17 . Este método também fará parte da classe PessoaDAO. Que recebe um objeto do tipo pessoa como parâmetro. Passaremos agora para o método “Deletar”. alterar os dados necessários e depois utilizar este método para atualizar os dados da pessoa no banco de dados. Jaime K. porém.Benefrancis do Nascimento.Método Deletar . é necessário consultar uma pessoa utilizando o método consultar.Método Atualizar O ponto de número “1” chama atenção para o método merge que recebe o objeto que será alterado na tabela do banco de dados. Veja abaixo como é simples o código: Figura 16 . antes de chama-lo. Ossada 25 Agora abordaremos o método Atualizar.java.

br AGRADECIMENTOS Sou imensamente agradecido a Agesandro Scarpioni. a Christian Bauer. Pedro Brigatto. Luís Vinícius Antunes Palma. . Jorge Cruz. Paulo Roberto da Silva. Ossada meu orientador neste artigo científico. 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. Marco Akio. Cris Becker. Aconselhamos que exercitem os conceitos aqui apresentados dando continuidade à nossa aplicação de exemplo desenvolvendo um sistema um pouco mais complexo. 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.com jaimeossada@uol. Steve Ebersole. Paulo Nunes.26 Mapeamento objeto relacional com Hibernate Repare que este método é muito parecido com o método atualizar. 6. Esperamos que este artigo se torne um material de grande valor aos estudantes e desenvolvedores de sistemas. O contato deverá ser estabelecido por meio dos seguintes endereços eletrônicos:   benefrancis@gmail. ao Jaime K.com. Fábio Luís R. Carla Pelissoni. Gavin King. a minha maravilhosa mãe Maria Raquel do Nascimento que é pra mim referência de pessoa digna e trabalhadora. CONSIDERAÇÕES FINAIS Abordamos conceitos importantes sobre o mapeamento objeto relacional com JPA e Hibernate. Max Andersen e todas as pessoas que ajudaram a criar e aprimorar o Hibernate. Estamos abertos a criticas e sugestões. o que muda de um para outro é apenas o método utilizado da sessão que neste caso é o delete(p) passando como parâmetro um objeto do tipo pessoa. Michel Masiero de Aquino. A escolha de persistir pessoas em banco de dados foi proposital neste sentido. Isaías Inácio de Deus. 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. Pelissoni. com objetivo de alimentar o processo de melhoria contínua de nossos artigos.

1994. Jaime K. J. ZICARI. Qualidade de software: aprenda as metodologias e técnicas mais modernas para o desenvolvimento de software. SOARES M.M. Ed. OGLIO D. Object Oriented Analysis and Design with Applications.. EUA: Willey Computer Publishing.221. Vol. Dominando Hibernate. 1970. 2000. Object-Oriented Modeling and Design for Database Applications. PREMERLANI W. Ossada 27 REFERÊNCIAS BLAHA M. 281283. São Paulo: Novatec Editora. No. 2009.S. Tradução do original: Harnessing Hibernate. ELLIOTT J. Addison-Wesley. Ed. 1997). A Relational Model of Data for Large Shared Data Banks.. T. p. FOWLER R. 2007. Rio de Janeiro: AltaBooks. Communications of the ACM.. São Paulo: Novatec Editora.125. Prentice Hall. KOSCIANSKI A. p.. Englewood Cliffs: Prentice Hall.. p. . 6. 1991.P. Succeeding with Object Databases: A Practical Look at Today's Implementations with Java and XML. A. 13. RAUMBAUGH.Benefrancis do Nascimento. R. B. Ed. O’BRIEN T. Object-Oriented Modeling and Design. 2. PHP: programando com orientação a objetos. 2009. BOOCH G. United States ed edition (July 27. 2. CHAUDRI. CODD. 1.

Sign up to vote on this title
UsefulNot useful