39935485 Artigo to Objeto Relacional Com Hibernate Benefrancis Do Nascimento

  • Upload
    rone99x

  • View
    116

  • Download
    0

Embed Size (px)

Citation preview

MAPEAMENTO OBJETO RELACIONAL COM HIBERNATEUtilizando anotaes hibernate em programao orientada a objetos com Java.Benefrancis do Nascimento Anhanguera [email protected]

RESUMO crescente a adoo da orientao a objetos como paradigma para o desenvolvimento de softwares, entretanto grande parte das empresas mantm o uso de bancos de dados relacionais. Resistindo, por diversos motivos, a migrar para bancos de dados orientados a objetos. Sabemos que manter programao 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 caractersticas da implementao, pelos sistemas gerenciadores de banco de dados, da SQL. Da nasceu necessidade de criar uma interface na qual fosse possvel 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 anotaes JPA e o framework hibernate em classes Java. Concluiremos este artigo desenvolvendo uma aplicao simples que exemplificar as principais caractersticas do mapeamento objeto relacional. Palavras-Chave: Java, hibernate, banco, dados, mapeamento, JPA.

Jaime K. Ossada Anhanguera [email protected]

ABSTRACTIs 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.Correspondncia/Contato Alameda Maria Tereza, 2000 Valinhos, So Paulo CEP. 13.278-181 [email protected]

1

2

Mapeamento objeto relacional com Hibernate

1.

INTRODUOA maioria dos sistemas de software que tm o seu desenvolvimento iniciado atualmente (no so sistemas legados) utiliza Anlise 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 aplicaes, desenvolvemos este material. Aps a leitura deste artigo voc ser capaz de: definir conceito de persistncia; trabalhar com o framework hibernate; configurar um ambiente para desenvolvimento de aplicao 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 aplicao orientada a objetos; persistir objetos em bancos de dados relacionais e manipul-los;

2.

REVISO BIBLIOGRFICAPara melhor entendimento dos tpicos abordados, iniciaremos este artigo fazendo reviso bibliogrfica das tecnologias envolvidas respeitando a ordem a seguir: Principais conceitos sobre programao orientada a objeto; Persistncia; Banco de dados estruturais e a SQL;

Caso esteja familiarizado com esses conceitos poder avanar para o prximo captulo onde abordaremos o mapeamento objeto relacional com hibernate e a HQL.

2.1. Programao orientada a objetos (POO)Durante varias dcadas, a construo de programas foi abordada sob um ponto de vista: decomposio algortmica. Assim, grandes programas so divididos em mdulos e estes, em funes. O paradigma orientado a objetos (OO) oferece uma alternativa diferente para particionar um problema, que no se baseia apenas em algoritmos (BOOCH, 1994).

J BLAHA et. al. (1997, p1) definem orientao a objeto como sendo a estratgia para a organizao de sistemas em colees de objetos que se interagem combinando dados e comportamentos. Objetos so unidades de programas que, basicamente:

Benefrancis do Nascimento, Jaime K. Ossada

3

contm um estado em geral invisvel ao exterior; contm mtodos (algoritmos) que mudam o estado do objeto; fornecem uma interface que expe mtodos e, eventualmente, componentes do estado; so organizados em hierarquia de classes.

Objetos so criados a partir de classes. A classe a representao de um conjunto de objetos reconhecidos por compartilhar as mesmas caractersticas de atributos, operaes, relaes e semntica. Ao particionar um programa, o paradigma OO oferece uma vantagem em relao ao uso de mdulos, conhecida como information hiding, encapsulamento ou ocultao de informao (pode-se utilizar um objeto sem conhecer sua construo 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 integrao dos diversos componentes ter grande chance de sucesso. O encapsulamento aumenta as possibilidades de reuso. Por exemplo, se em um sistema criado um objeto cliente, contendo dados cadastrais e mtodos como gravar e atualizar, tal objeto poder ser reaproveitado nos projetos seguintes que tambm referenciem clientes. Koscianski et. al. (2007) definiram que O mecanismo de herana permite o reuso de cdigo. Alm de herdar os atributos e mtodos originais, a nova classe conhecida como filha, derivada ou subclasse pode acrescentar novas caractersticas, estendendo as funcionalidades da superclasse original. Em uma linguagem de programao a comunicao entre objetos feita por chamada de mtodos cada mtodo possui uma assinatura que corresponde ao nome do mtodo e os tipos dos parmetros que ele recebe. Observe que num mtodo podemos passar como parmetro outros objetos e se o objeto passado for do tipo da super classe o mtodo acionado ser o da classe ancestral. E a isso damos o nome de polimorfismo. Em nosso projeto utilizaremos Java como linguagem de programao orientada a objetos, porm o hibernate pode ser utilizado em aplicaes .NET.

4

Mapeamento objeto relacional com Hibernate

2.2. PersistnciaDe modo geral, persistncia significa continuar a existir, preservar, durar longo tempo ou permanecer (OGLIO, 2009). No contexto de programao orientada a objeto, a persistncia significa a possibilidade de esses objetos serem armazenados em meio externo aplicao, portanto dever permitir que esses objetos no sejam volteis. Atualmente os bancos de dados relacionais so o meio mais utilizado para isso, porm no so os nicos.

2.3. Banco de dados estruturados e a SQLNos anos 60 os dados de uma aplicao eram mantidos aleatoriamente em arquivos, que muitas vezes faziam parte da aplicao. Foi nessa poca que surgiram os primeiros SGBDs1 comerciais que traziam como novidade o armazenamento de dados independente da aplicao, mas no possuam ferramentas eficientes de acesso a esses dados. Codd (1970) props a criao de linguagens de alto nvel, permitindo manipulao eficiente. Foi da o incio da criao da SQL2 A histria da SQL comea em 1970 com a publicao por Codd, no ACM Journal, 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 Sistema de Gesto de Base de Dados Relacional (SGBDR). A primeira implementao da linguagem SEQUEL3 foi realizada pela IBM e tinha por objetivo a implementao do modelo de Codd. A evoluo desta linguagem veio a dar origem SQL. A primeira implementao comercial da SQL foi realizada pela Relational Software, Inc., hoje conhecida por Oracle Corporation. Nos dias de hoje, a linguagem SQL considerada um standard dos Sistemas de Gesto de Base de Dados Relacionais (SGBDR); por isso, todos os fabricantes a integram nos seu produtos, porm todos os bancos de dados possuem um grupo especfico de caractersticas e limitaes. Para lidar com essa realidade o desenvolvedor acaba perdendo um precioso tempo.

1 SGBDs: Sistema de Gesto 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, acrnimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Ingls)

Benefrancis do Nascimento, Jaime K. Ossada

5

3.

MAPEAMENTO OBJETO RELACIONAL tcnica de mapear os atributos e relacionamentos das classes que daro origem a objetos que sero persistidos em bancos de dados relacionais, dar-se- o nome de mapeamento objeto relacional ou em ingls Object Relational Mapping (ORM).Tabela 1 - Comparao entre as mais utilizadas tcnicas para persistncia de objetos Tcnica Descrio Persistindo objetos em banco de dados relacional utilizando a JDBC permite que os programadores espalhem cdigo SQL nas classes e, ao utilizar esta tcnica, os atributos das classes so espalhados pelas tabelas no banco de dados. Torna a programao mais trabalhosa e de difcil manuteno.

Persistir em bancos de dados orientados ao objeto o cenrio ideal, pois o programador trabalha seguindo apenas um paradigma. Torna o sistema mais simples para manuteno, porque os objetos sero refletidos no banco de dados e organizados com o uma coleo. Para Chaudri & Zicari (2001) uma base de dados orientada a objetos apenas uma coleo de objetos, enquanto em um sistema orientado a objetos, cada objeto representa cada entidade do mundo real.

Persistir utilizando framework Hibernate permite ao programador desenvolver o sistema pensando somente em um paradigma, porm importante ter noo sobre normalizao de banco de dados relacional para desenvolver software de boa qualidade. Esta tcnica livra o programador de ter que lidar com caractersticas diferentes entre os bancos de dados relacionais. Torna o software de fcil manuteno e com portabilidade para qualquer SGBDR. Bastando para isso modificar apenas o dialeto no arquivo hibernate.cfg.xml. Muitas pessoas tm receio de utilizar framework, pois temem que o projeto seja descontinuado, porm ao utilizar um ORM que implemente a JPA torna uma possvel migrao para outro framework uma tarefa de baixa complexidade porque no ser necessrio ter que mapear todas as propriedades das classes, uma vez que as classes fazem import de javax.persistence.* (JPA) para a maioria das anotaes.

3.1. Hibernate e a HQLO Hibernate uma ferramenta para mapeamento objeto relacional largamente utilizada 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 hibernate faz com que o desenvolvedor se livre de escrever diversas linhas de cdigo pa-

6

Mapeamento objeto relacional com Hibernate

ra acesso a banco de dados, bem como, de instrues em DML4 que ele escreveria caso no utilizasse a ferramenta. , portanto, uma ferramenta que acelera o desenvolvimento 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 lgica de negcios na prpria aplicao, dependendo pouco de funes especficas do banco de dados. Ou seja, o hibernate no indicado para sistemas em que as regras de negcio esto sob responsabilidade do banco de dados, codificadas em stored procedures ou triggers. Para eficcia do seu projeto de mapeamento necessrio analisar o diagrama de entidade e relacionamento (DER) e o diagrama de classes, pois eles devem refletir logicamente a aplicao que ser desenvolvida.Tabela 2 - Diagrama de Entidades e Relacionamentos comparado com o Diagrama de Classes DiagramasENTIDADE E

Consideraes Pessoa tem relao 1:1 com PF e PJ e relao 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 tambm a chave primaria nessas tabelas.

RELACIONAMENTO

DIAGRAMA

DE

A classe Pessoa abstrata, portanto no se transforma em objeto. Pessoa classe me de PF e PJ, desta forma as classes filhas herdam as propriedades, mtodos e associaes da classe Pessoa. Uma pessoa poder possuir vrios telefones, mas um telefone no faria sentido em nossa aplicao sem uma pessoa.

DIAGRAMA DE CLASSES

A HQL a linguagem utilizada para consulta no hibernate. As instrues em HQL tm como objetivo retornar objetos enquanto que as instrues em SQL retornam a linhas e colunas de uma ou mais tabelas. A figura 3 compara as instrues SQL e HQL que retornam todas as pessoas fsicas cujo telefone tenha o DDD igual a 11.

4

DML: linguagem de manipulao de dados utilizada nos SGBDs.

Benefrancis do Nascimento, Jaime K. Ossada

7

Figura 1 - Comparao entre instruo SQL e HQL

No obrigatrio o comando SELECT na instruo HQL, pois em HQL no necessitamos informar os atributos que desejamos obter como resposta, uma vez que o objetivo retornar objetos do tipo definido no comando FROM.

3.2. Anotaes utilizando o padro Java Persistence API (JPA)JPA uma API padro do Java para persistncia que dever ser implementada pelos frameworks que queiram seguir o padro 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 anotao uma maneira de acrescentar informaes sobre uma parte do cdigo (no mundo Java, geralmente uma classe, um campo ou mtodo) para ajudar as ferramentas entenderem como o cdigo est sendo utilizado ou para permitir a automatizao, poupando trabalho.

Tabela 3- As principais anotaes do JPA Anotao @Entity @Table Descrio Declara a classe como persistente. Define qual a tabela utilizada para armazenar os valores da classe. No obrigatrio se a tabela tiver o mesmo nome da classe. Define a propriedade que a chave primria da classe/tabela. Esta anotao obrigatria. Define que uma determinada propriedade da classe no persistente, portanto no ter uma coluna na tabela. Define a estratgia de fetch para uma propriedade de uma classe (lazy, por exemplo). Define que a propriedade do tipo data (TemporalType.DATE), hora (TemporalType.TIME) ou data/hora (TemporalType.DATE-TIME). Define a propriedade de uma classe como do tipo enumerado. Define a propriedade como de um tipo binrio ou maior que 255 caracteres. Permite declarar uma propriedade para controlar lock otimista. Permite especificar qual a coluna de banco de dados utilizada

@Id @Trasiente @Basic @Temporal

@Enumerated @Lob @Version @Column(name=nome_coluna, nul-

8

Mapeamento objeto relacional com Hibernate

lable=true ou false, lenght=20) @GeneratedValue @JoinColumn(name=nome da coluna de relacionamento, unique=true ou false) @JoinTable(name=pessoa_telefone, JoinColumns={ @JoinColumn(name=ref_pessoa_id) }, inverseJoinColumns={ @JoinColumn(name=ref_telefone_id ) })

para armazenar o valor de uma propriedade. Utilizamos juntamente com @Id para determinar a estratgia de gerao do Id. Definimos aqui os parmetros de colunas utilizadas para garantir o relacionamento entre duas classes / tabelas. Definimos os parmetros para realizar o relacionamento entre duas classes / tabelas.

Mapeando associaes (uma classe por tabela)Abaixo apresentaremos as opes disponveis para mapeamento de associaes com JPA em que uma classe representar uma tabela no banco de dados.Tabela 4 - Mapeando associaes (uma classe por tabela) Relacionamento 1:1 DER Cdigo Java@Entity PublicclassPessoa{ @OneToOne PrivateTelefonetelefone; }

1:N

@Entity PublicclassPessoa{ @OneToMany PrivateCollectiontelefones; }

N:1

@Entity PublicclassTelefone{ @ManyToOne PrivatePessoapessoa; }

Benefrancis do Nascimento, Jaime K. Ossada @Entity PublicclassPessoa{ @ManyToMany PrivateCollectiontelefones; } @Entity PublicclassTelefone{ @ManyToMany PrivateCollectionpessoas; }

9

N:N

Mapeando associaes (mais de uma classe por tabela)Abaixo apresentaremos as opes disponveis para mapeamento de associaes com JPA em que mais de uma classe representar uma tabela no banco de dados.Tabela 5 - Mapeando associaes (mais de uma classe por tabela) Relacionamento Classes Embutidas Diagrama Cdigo Java@Entity PublicclassPessoa{ @Embeddable PrivateTelefonetelefone; Stringnome; } @Embeddable PublicclassTelefone{ Privateintddd; PrivateStringnumero; }

Chaves Compostas

@Entity publicclassPessoa{ @EmbeddableId Privaterg; Stringnome; } @Embeddable PublicclassRg{ Stringrg; StringufRg; }

Mapeando HeranaAbaixo apresentaremos as opes disponveis para mapeamento de heranas. Temos trs estratgias:

10

Mapeamento objeto relacional com Hibernate

Juno de tabelas (Joined); Tudo em uma tabela (Single Table); Uma tabela por classe (Table per Class).

Tabela 6 - Estratgias para mapeamento de herana Estratgia Juno Diagrama Cdigo Java@Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="tipo") publicabstractclassPessoa{ } @Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorValue("PF") publicclassPFextendsPessoa{ } @Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorValue("PJ") publicclassPJextendsPessoa{ } @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="tipo") publicabstractclassPessoa{ } @Entity @DiscriminatorValue("PF") publicclassPFextendsPessoa{ } @Entity @DiscriminatorValue("PJ") publicclassPJextendsPessoa{ } @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) publicabstractclassPesso{ } @Entity publicclassPFextendsPessoa{ } @Entity publicclassPJextendsPessoa{ }

1 Tabela

1 tabela por classe

4.

ESTUDO DE CASOEfetuaremos a persistncia de objetos de uma aplicao Java que implementa o diagrama de classes exibido na figura 3. Para desenvolvimento do nosso estudo de caso efetuamos o download dos seguintes programas:

Benefrancis do Nascimento, Jaime K. Ossada

11

Ide Netbeans 6.8 completo (j vem com o framework hibernate embutido)5; Banco de dados Mysql6; Mysql-connector-java-5.1.6-bin.jar ou verso superior7

4.1. SITUAO PROBLEMADesenvolveremos uma aplicao que dever permitir cadastrar, consultar e excluir pessoas fsicas e jurdicas e seus respectivos telefones. Abaixo nosso diagrama de classes:

Figura 2 - Diagrama de Classes

5.

IMPLEMENTAO UTILIZANDO MAPEAMENTO OBJETO RELACIONALIniciaremos agora a implementao utilizando mapeamento objeto relacional com anotaes em nossas classes.

5.1. Configurando o ambiente de desenvolvimentoProgramaremos a nossa aplicao utilizando o ide Netbeans. Porm antes de iniciarmos a codificao 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` poder utilizar o HeidiSQL8 para esta tarefa ou usar o prompt de comandos.

5 6

Disponvel em: http://netbeans.org Disponvel em: http://www.mysql.com/downloads/mysql/ 7 Disponvel em: http://www.mysql.com/downloads/connector/j/ 8 Front-end grtis para banco de dados MySql - disponvel em: http://www.heidisql.com

12

Mapeamento objeto relacional com Hibernate

No Netbeans: Abra o Netbeans, v at o menu: Arquivo>Novo Projeto. Na janela que ser aberta o local onde ser configurado nosso ambiente. Para configurao dever seguir os quatro passos, conforme segue: 1. Escolha o projeto: selecione a categoria Java/Web Aplicao Web em seguida clique em prximo; 2. Nome e local: para o nome digite ORM sem as aspas. Aceite o local padro para local e pasta do projeto; 3. Servidor e configuraes: para servidor escolha Apache Tomcat. Verso do Java escolha Java EE 5 ou superior se for o caso; 4. Frameworks: Selecione apenas o hibernate. A verso que utilizamos a 3.2.5. em conexo de banco de dados selecione nova conexo com banco de dados. Aparecer a tela abaixo na qual dever ser escolhido o MySql (Connector/J driver) e demais parmetros conforme imagem abaixo, porm host, porta, usurio e senha podem no ser os mesmos em seu ambiente. Aps 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 codificao. Se tudo deu certo o Netbeans criou o arquivo hibernate.cfg.xml no pacote padro com as configuraes para acessar o banco de dados MySql. Altere o hibernate.cfg.xml conforme figura abaixo

Benefrancis do Nascimento, Jaime K. Ossada

13

para que contenha o nome das classes que sero mapeadas . Colocamos algumas outras propriedades, porm so opcionais.

Figura 4 - Contedo do arquivo hibernate.cfg.xml

Este arquivo em alguns sistemas poder no existir, porm em seu lugar dever existir um arquivo hibernate.properties.Tabela 7 - Descrevendo o contedo do arquivo de configurao do hibernate

Definimos o dialeto necessrio para trabalhar com o MySql. O hibernate saber todas as caractersticas 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 conexo.

Passamos qual o usurio e senha

14

Mapeamento objeto relacional com Hibernate

Show_sql: Aqui coloque true caso desejar que as instrues SQL sejam exibidas no console. Format_sql: Exibir o SQL formatado caso esteja como true. Pool_size: Tamanho da nossa piscina de conexes. No nosso caso, o hibernate poder manter 10 conexes com o banco de dados. Hbm2dll.auto: Esta ferramenta do hibernate gera o schema do banco de dados a partir das classes mapeadas. executada quando criamos o SessioFactory que veremos em breve. Os valores possveis so: 1. 2. 3. Create: Cria as tabelas no banco de dados; Create-drop: Cria a tabela quando o SessionFactory for iniciado e deleta todos os registros da base de dados quando encerra a aplicao. Jamais utilizar em ambiente de produo. Update: Atualiza colunas e tabelas. Esta opo no apaga colunas, somente insere novas se for necessrio.

Informamos ao hibernate quais as classes que sero mapeadas.

Em sistemas mais antigos, antes da criao do hibernate-annotations.jar, disponvel na biblioteca da nossa aplicao, o mapeamento tambm era realizado em arquivos XML, portanto caso efetue manuteno em sistemas mais antigos voc poder se deparar com mapeamentos de classes no arquivo hibernate.cfg.xmlou em outros arquivos XML, porm esta j no uma boa prtica, pois deixa a aplicao com cdigos muito espalhados. Agora que j estamos com nosso ambiente de desenvolvimento configurado, passaremos para a fase de codificao, pois nosso ambiente j esta apto para processar as nossas classes em Java incluindo anotaes hibernate. Explicaremos essas anotaes conforme formos utilizando.

5.2. CodificaoCriaremos agora nossas classes Java bean para criar uma classe basta clicar no pacote com o boto direito do mouse, selecionar NOVO > Classe Java. Veja imagem abaixo:

Benefrancis do Nascimento, Jaime K. Ossada

15

Figura 5 - Criando classe java no Netbeans

Criaremos classes com nome e pacote conforme descrio contida na tabela abaixo:Tabela 8 - Pacotes da nossa aplicao Pacote Descrio e contedo Neste pacote criaremos os arquivos java beans contendo anotaes para persistncia. Com os nomes a seguir: 1. Pessoa.java; 2. PF.java; 3. PJ.java; 4. Telefone.java Neste pacote criaremos o arquivo ConexaoHibernate.java. Responsvel pela coleta das informaes do arquivo de configurao, conexo com base de dados e pelo retorno da sesso desta conexo. Criaremos os arquivos para manipulao de dados utilizando hibernate: 1. PessoaDAO.java; 2. TelefoneDAO.java Neste pacote criaremos a classe inicio.java. classe responsvel pelo mtodo main (ponto de partida da aplicao).

A seguir exibiremos o contedo de cada arquivo contendo nossas observaes. Os mtodos para acesso aos atributos dos objetos encapsulados (getters and setters) foram omitidos para economizar espao neste material, porm para cri-los basta, aps digitar o contedo das imagens a seguir, ir ao menu Refatorar > Encapsular campos. O Netbeans abrir uma janela semelhante a que exibiremos na figura abaixo:

16

Mapeamento objeto relacional com Hibernate

Figura 6 - Encapsulando campos

Benefrancis do Nascimento, Jaime K. Ossada

17

5.3. Pacote br.com.ORM.bean Pessoa.java

Figura 7 - Contedo da classe Pessoa

Acabamos de codificar a classe pessoa, logo abaixo comentaremos os pontos mais importantes que nela contm.Tabela 9 - Comentrios sobre o mapeamento da classe Pessoa Ponto Descrio Quando digitamos @Entity, o hibernate oferece duas classes para importao. Quando estiver mapeando a classe, prefira importar de javax.persistence.*, pois desta forma seu mapeamento ficar independente de framework. Entretanto repare que a anotao @Cascade necessita que o importe seja de org.hibernate.annotations.*. @Inheritance(strategy = InheritanceType.JOINED): Estamos dizendo que a herana est ou ser representada em base de dados com tabelas relacionadas. Ou seja, existe uma tabela para a classe me e outra para classe filha. @DiscriminatorColumn(name = tipo): Quando a herana possui estratgia igual a InheritanceType.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 primria da tabela e qual o esquema utilizado para gerar a chave. No nosso caso o esquema utilizado automtico. (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 parmetro nullable = false diz ao hibernate que o campo not null. J o parmetro lenght = 2

18

Mapeamento objeto relacional com Hibernate

significa que o campo tem tamanho igual a 2. @OneToMany: Informa que existe relacionamento entre pessoa e telefone do tipo 1:N.

PF.java

Figura 8 - Contedo da classe PF

Na classe pessoa cabe observar a anotao @DiscriminatorValue que em nossa aplicao PF esta anotao obrigatria quando escolhemos a estratgia de herana do tipo JOINED. No se esquea de encapsular o atributo cpf.

PJ.java

Figura 9 - Contedo da classe PJ

A classe PJ se difere da classe PF apenas no valor da anotao @DiscriminatorValue que nesta classe PJ e no tamanho do campo CNPJ que aqui igual a 18.

Benefrancis do Nascimento, Jaime K. Ossada

19

Telefone.java

Figura 10 - Classe Telefone

A anotao @JoinColunm faz referncia ao atributo idPessoada classe Pessoa permitindo atualizao e insero. Antes de continuar, crie mtodos construtores e verifique se encapsulou todos os atributos das classes deste pacote.

5.4. Pacote br.com.ORM.conexaoIniciaremos agora a codificao da classe que ser responsvel pela conexo com o hibernate e retorno da sesso desta conexo.

20

Mapeamento objeto relacional com Hibernate

ConexaoHibernate.java

Figura 11 - Classe ConexaoHibernate

5.5. Pacote br.com.ORM.hibernateDAONeste pacote criaremos as classes responsveis pela persistncia, consulta e manipulao dos dados armazenados nas tabelas do nosso banco de dados. uma boa pratica separar as classes que contenham os mtodos de negcio das classes que contenham dos mtodos que manipulam informaes em banco de dados. Esta tcnica torna o sistema mais fcil para um futura manuteno.

Benefrancis do Nascimento, Jaime K. Ossada

21

PessoaDAO.java

Figura 12 - Classe PessoaDAO

22

Mapeamento objeto relacional com Hibernate

Para salvar uma pessoa no banco de dados utilizaremos polimorfismo. Repare que no mtodo salvar o parmetro esperado do tipo Pessoa, entretanto se enviarmos uma PF ou PJ as informaes sero salvas corretamente nas tabelas do banco de dados. Outra tcnica importante da orientao a objeto empregada nesta classe a sobrecarga de mtodos presente no mtodo Consultar (veja a assinatura dos mtodos).

TelefoneDAO.java

Figura 13 - Classe TelefoneDAO

Repare que o mtodo salvar da classe TelefoneDAO.java muito parecido com o mtodo salvar da classe PessoaDAO.java mudando apenas a assinatura que neste caso espera receber um objeto Telefone. Tendo como base os outros mtodos da classe PessoaDAO.java.

5.6. Criando o banco de dados para persistir e manipular objetosCriaremos 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 trs mtodos. So eles: GerarTabelas();

Benefrancis do Nascimento, Jaime K. Ossada

23

Persistir(); main(String[] args)

Figura 14 - Contedo da classe Inicio

No mtodo GerarTabelas() acessamos as configuraes de anotao das classes que marcamos como mapeveis no arquivo hibernate.cfg.xml e em seguida chamamos o mtodo create da classe SchemaExporte (classe do hibernate). Ao chamar este mtodo o hibernate acessa o banco de dados e cria as tabelas conforme os mapeamentos efetuados, mas ateno: Caso as tabelas j existirem no banco de dados, sero apagadas e recriadas. Em nosso mtodo Persistir() criamos uma pessoa fsica utilizando um mtodo construtor9, criamos uma lista de telefones e, em seguida, associamos pessoa e sal-

9

lembre-se que dever criar mtodos construtores nas classes do pacote br.com.ORM.bean

24

Mapeamento objeto relacional com Hibernate

vamos no banco de dados. Logo em seguida criamos uma pessoa jurdica adicionamos mais um telefone lista de telefones, associamos lista de telefones pessoa jurdica e chamamos o mtodo Salvar.

5.7. Manipulando dados persistidosFaremos agora trs mtodos para exemplificar como consultar, alterar e apagar objetos persistidos. Esses mtodos devero ser includos na classe PessoaDAO.java que se encontra no pacote br.com.ORM.hibernateDAO. Comearemos ento consultando pessoa pelo nome.

Figura 15- Consultando pessoas pelo nome

Tendo este cdigo como base, fica fcil codificar consultas (lembre-se de usar a sobrecarga de mtodos), bastando apenas mudar os parmetros, a query HQL e o tipo de retorno conforme a situao. Abaixo comentaremos os pontos mais relevantes do mtodo consultar.Tabela 10 - Pontos importantes no metodo Consultar

Ponto

Observao O mtodo recebe como parmetro uma String que dever ser o nome da pessoa que se deseja consultar . O retorno ser uma lista de pessoas. A sesso cria uma query no padro HQL que espera pelo parmetro nome. Configuramos aqui o parmetro nome.

Benefrancis do Nascimento, Jaime K. Ossada

25

Agora abordaremos o mtodo Atualizar. Que recebe um objeto do tipo pessoa como parmetro. Este mtodo tambm far parte da classe PessoaDAO.java, porm, antes de chama-lo, necessrio consultar uma pessoa utilizando o mtodo consultar, alterar os dados necessrios e depois utilizar este mtodo para atualizar os dados da pessoa no banco de dados. Veja abaixo como simples o cdigo:

Figura 16 - Mtodo Atualizar

O ponto de nmero 1 chama ateno para o mtodo merge que recebe o objeto que ser alterado na tabela do banco de dados. Passaremos agora para o mtodo Deletar. Veja o contedo na figura abaixo:

Figura 17 - Mtodo Deletar

26

Mapeamento objeto relacional com Hibernate

Repare que este mtodo muito parecido com o mtodo atualizar, o que muda de um para outro apenas o mtodo utilizado da sesso que neste caso o delete(p) passando como parmetro um objeto do tipo pessoa.

6.

CONSIDERAES FINAISAbordamos 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 conceitos aqui apresentados dando continuidade nossa aplicao de exemplo desenvolvendo um sistema um pouco mais complexo. A escolha de persistir pessoas em banco de dados foi proposital neste sentido, pois a maioria das aplicaes necessita persistir pessoas e o cdigo fonte que construmos poder servir como base para diversas aplicaes. Estamos abertos a criticas e sugestes, com objetivo de alimentar o processo de melhoria contnua de nossos artigos. O contato dever ser estabelecido por meio dos seguintes endereos eletrnicos: [email protected] [email protected]

AGRADECIMENTOSSou imensamente agradecido a Agesandro Scarpioni, Carla Pelissoni, Cris Becker, Fbio Lus R. Pelissoni, Isaas Incio de Deus, Jorge Cruz, Lus Vincius 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 anlise e desenvolvimento de sistemas, ao Jaime K. Ossada meu orientador neste artigo cientfico, a minha maravilhosa me Maria Raquel do Nascimento que pra mim referncia de pessoa digna e trabalhadora, a Christian Bauer, Gavin King, Steve Ebersole, Max Andersen e todas as pessoas que ajudaram a criar e aprimorar o Hibernate, a minha esposa Edilaine Sudr Marcelino do Nascimento e aos meus filhos Bruno Sudr do Nascimento e Erick Sudr do Nascimento por me apoiarem nos mais desafiadores e emocionantes projetos que participo.

Benefrancis do Nascimento, Jaime K. Ossada

27

REFERNCIASBLAHA 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.; OBRIEN T.M.; FOWLER R. Dominando Hibernate. Traduo do original: Harnessing Hibernate. Rio de Janeiro: AltaBooks, p.125, 2009. KOSCIANSKI A.; SOARES M.S. Qualidade de software: aprenda as metodologias e tcnicas mais modernas para o desenvolvimento de software. 2. Ed. So Paulo: Novatec Editora, p. 281283, 2007. OGLIO D.P. PHP: programando com orientao a objetos. 2. Ed. So Paulo: Novatec Editora, p.221, 2009. RAUMBAUGH, J. Object-Oriented Modeling and Design. Englewood Cliffs: Prentice Hall, 1991.