quarta-feira, 14 de novembro de 2012

Hibernate - Parte III

Classe a ser persistida


Para o mapeamento em tabelas em um banco de dados o Hibernate utiliza classes consideradas POJO (Plain Old Java Objects). É necessário criar um arquivo de configuração que relacionamos em hibernate.cfg.xml para a classe Contato.java.

Primeiro vamos ver nossa classe simples:
Estamos criando uma classe simples com 4 campos encapsulados por getters e setters apropriados.

Criando o mapeamento da classe em XML

E agora vamos criar um arquivo de configuração para mapear a nossa classe de contatos:

Note que criamos uma entrada para com a tag <id>  que irá mapear a chave primária da tabela. Como sou muito criativo, o atributo do objeto e a coluna da tabela também chamam id.

Criei ainda 3 outras entradas utilizando a tag <property>, cada uma mapeando um dos atributos do objeto.

Por fim perceba que estas entradas estão todas dentro de uma tag <class> e esta tag tem uma propriedade denominada name que faz a relação com o objeto que criamos acima. Percebam que é necessário colocar o nome do pacote também.

terça-feira, 13 de novembro de 2012

Hibernate - Parte II

Configurando o arquivo de persistência do Hibernate

Na nossa aplicação de teste utilizaremos o Hibernate para gerenciamento de transações e conexões. Teremos que criar um arquivo de configuração que chamaremos de hibernate.cfg.xml. Neste arquivo criamos as configurações de conexão. Note que identificamos o driver, a URL que indica onde está o banco de dados, o usuário e a senha de acesso ao banco de dados. Além disto temos o mapeamento da classe que será persistida. No nosso caso é a classe Contato.

O modelo do arquivo XML de persistência é:



Para nosso exemplo utilizaremos o banco de dados Derby que é instalado juntamente com o NetBeans. Note nas primeiras linhas os parâmetros de conexão:
  • dialeto
  • driver_class
  • url
  • username
  • password

Podemos utilizar o Hibernate com diversos bancos de dados, os dialetos devem refletir o banco de dados correto, bem como a URL da conexão:
  • DB2 - org.hibernate.dialect.DB2Dialect
  • FrontBase - org.hibernate.dialect.FrontbaseDialect
  • HypersonicSQL - org.hibernate.dialect.HSQLDialect
  • Informix - org.hibernate.dialect.InformixDialect
  • Ingres - org.hibernate.dialect.IngresDialect
  • Interbase - org.hibernate.dialect.InterbaseDialect
  • Mckoi SQL - org.hibernate.dialect.MckoiDialect
  • Microsoft SQL Server - org.hibernate.dialect.SQLServerDialect
  • MySQL - org.hibernate.dialect.MySQLDialect
  • Oracle (any version) - org.hibernate.dialect.OracleDialect
  • Oracle 9 - org.hibernate.dialect.Oracle9Dialect
  • Pointbase - org.hibernate.dialect.PointbaseDialect
  • PostgreSQL - org.hibernate.dialect.PostgreSQLDialect
  • Progress - org.hibernate.dialect.ProgressDialect
  • SAP DB - org.hibernate.dialect.SAPDBDialect
  • Sybase - org.hibernate.dialect.SybaseDialect
  • Sybase Anywhere - org.hibernate.dialect.SybaseAnywhereDialect
No final do arquivo existe uma propriedade definida como:

     <property name="hibernate.show_sql">true</property>

Esta propriedade define que ao ser executado o programa o hibernate irá mostra os comandos SQL que está utilizando. Se este fosse um programa em produção, normalmente esta opção estaria com false ou o resultado seria gerado para um arquivo de log.

A última propriedade definida no arquivo é

<property name="hibernate.hbm2ddl.auto">create</property>

Isto garante de que o Hibernate irá automaticamente validar e exportar o esquema DDL (a estrutura das tabelas) para o banco de dados. Com a propriedade em create, ao tentar conectar no banco de dados, se as tabelas não existirem, elas serão criadas.

Mais informações sobre as configurações de sessões podem ser achadas neste site.

    segunda-feira, 12 de novembro de 2012

    Hibernate - Parte I

    Nós sempre precisamos guardar os dados que manipulamos em nossos programas. Algumas vezes basta utilizar um arquivo, como por exemplo para guardar as configurações de um programa ou o escore de um jogo, mas para a maioria das aplicações empresariais, guardar dados significa: acessar um banco de dados, inserir, editar, apagar e manipular informações.

    Uma forma de realizar esta tarefa é acessando diretamente o banco de dados, controlar cada atividade utilizando comandos SQL. Já vimos em um post anterior como criar uma conexão com um banco de dados.

    Outra forma é realizar a persistência usando a biblioteca Hibernate. Este pacote realiza um mapeamento tipo objeto-relacional fornecendo um framework para mapear os objetos na linguagem Java para um banco de dados relacional tradicional (como SQL Server, MySQL, Oracle, Apache Derby ou outros).

    Hibernate irá mapear classes Java para tabelas do banco de dados e mapeara os tipos de dados Java em tipos SQL, além de fornecer métodos de pesquisa de dados (realização de Query) e outros métodos de acesso a dados, gerando as chamadas SQL para nós e também manipulando os resultadores retornados pelo banco de dados utilizando estruturas de classes. Com isto as aplicações são portáveis para diferentes bancos de dados, bastando trabalhar as configurações de persistência, pois as operações são sempre iguais. O impacto em performance é pequeno em relação ao ganhos obtidos em facilidade de programação e portabilidade.

    O mapeamento das classes Java em tabelas é feito por meio de configurações em arquivos XML ou utilizando Annotations. Eu particularmente prefiro Annottations, pois a indicação no código é bastante esclarecedora e nos economiza a necessidade de ter que criar arquivos XML para o esquema de persistência.

    Hibernate ainda permite a criação de relacionamentos 1-para-muitos e muitos-para-muitos. Também permite criar relacionamentos reflexivos onde um objeto que possuir uma relação um-para-muitos com outras instâncias de sua classe. Temos suporte para herança, polimorfismo, composição e Java Collection. Com Hibernate temos condições de suporte a geraçao automática da chave primária.

    O Hibernate é tão flexível que permite que criemos mapeamentos para tipos customizados, do tipo:
    • sobrepor um tipo SQL quando mapeamos uma coluna a uma propriedade da classe;
    • mapear um tipo Enum Java para colunas com se elas fossem propriedades regulares;
    • mapear uma propriedade para múltiplas colunas em uma tabela.
    Hibernate provê três mecanismos de pesquisa:
    1. Hibernate Query Language (HQL) 
    2. Hibernate Criteria Query API e
    3. suporte para pesquisas em formato SQL nativo do banco de dados.
    A arquitetura do Hibernate pode ser representada pelo diagrama abaixo:
    Existem 3 principais componentes no Hibernate:
    • Connection Management
    Hibernate Connection fornece uma forma fácil de administrar as conexões com o banco de dados. Esta normalmente é a parte mais dispendiosa na interação com o BD utilizando muitos recursos para abertura e fechamento de conexões.
    • Transaction management
    O Transaction management fornece a capacidade do usuário executar mais de uma chamada ao banco de dados ao mesmo tempo.
    • Object relational mapping
    O mapeamento Objeto-Relacional é uma técnica que mapeia (traduz) da representação dos dados no modelo de objeto (os objetos e suas propriedades) em um modelo de dados relacionais (as tabelas e colunas). Este mapeamento é utilizado para selecionar, inserir, atualizar e apagar registros em uma tabela.

    Quando enviamos um objeto para o método Session.save() do Hibernate, este lê o estado das variáveis deste objeto e executa a query necessária.
    Chega de falação...leia no próximo post o nosso primeiro exemplo de Hibernate.
    Nos próximos posts, vamos ver como criar o arquivo de configuração de persistência, vamos criar uma classe a ser persistida utilizando o mapeamento por XML e usando Annottations.