Hibernate Mapeamento O/R
Hibernate – O que é? Ferramenta para mapeamento O/R em Java Uma das mais difundidas Separação entre a aplicação e o acesso ao banco Facilidade de uso Controle de transações Independência quanto ao tipo de base de dados Consulta de dados HQL Criteria Queries Licença LGPL © LES/PUC-Rio
Hibernate - Arquitetura
Arquitetura - Overview © LES/PUC-Rio
Hibernate – Classes Persistentes
Classes Persistentes Implementam entidades lógica do negócio POJOs (Plain Old Java Object) Construtor padrão Possui métodos de acesso – gets/sets (opcional) Possui um atributo identificador (opcional) Classes não final (recomendado) © LES/PUC-Rio
POJO - Exemplo © LES/PUC-Rio
POJO - Exemplo mapeamento © LES/PUC-Rio
Mapeamento Devemos informar ao Hibernate como relacionar o modelo de objetos com o modelo relacional Arquivos de mapeamento Descrevem como são feitos os mapeamentos © LES/PUC-Rio
Arquivo de Mapeamento Arquivo XML Declaração de DTD Útil para auto-completion Declaração das classes Usualmente possuem extensão .hbm.xml Comunidade.hbm.xml © LES/PUC-Rio
XML Recomendação da W3C para gerar linguagens de marcação para necessidades especiais Separação do conteúdo e da formatação Legibilidade tanto por humanos quanto por máquinas Possibilidade de criação de tags sem limitação Criação de arquivos para validação de estrutura Com seu uso pode-se interligar bancos de dados distintos Simplicidade Referencias http://www.w3schools.com/xml/ http://www.w3.org/XML/ © LES/PUC-Rio
Arquivo de Mapeamento – Ex POJO Declaração de classe usando o elemento class Indicação do nome da classe Indicação do nome da Tabela (opcional) © LES/PUC-Rio
Mapeamento de Identificadores Indicação da chave primária nome do atributo tipo Escolha do gerador da Chave ver classe © LES/PUC-Rio
Tipos de Geradores de Chave increment identity sequence hilo seqhilo uuid guid native assigned select foreign © LES/PUC-Rio
Mapeamento de Propriedades Elemento property Indicação de nome e tipo Se não explicitar coluna considera o nome da propriedade ver classe © LES/PUC-Rio
Mapeamento de Propriedades Tipos nomes de tipos básicos do Hibernate (integer, string, character, date, timestamp, float, binary, serializable, object, blob). nome de tipos básicos Java (int, float, char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob, java.util.Calendar). nome de uma classe Java Serializable. Se não especificado o Hibernate usa reflexão Outras propriedades Access (property | field): controla como o Hibernate vai acessar os atributos em tempo de execução (default: property) column: nome da coluna na tabela do banco (default: nome do atributo) not-null (true | false): determina se a propriedade pode ser nula (default: false) © LES/PUC-Rio
Mapeamento de Relacionamentos one-to-one many-to-one one-to-many many-to-many © LES/PUC-Rio
Mapeamento de Relacionamentos - Exemplo Unidirecional one-to-many Bidirecional many-to-many Unidirecional many-to-one Unidirecional many-to-one © LES/PUC-Rio
Mapeamento – many-to-one name class column © LES/PUC-Rio
Modelo relacional comunidades atores id <<PK>> nome descricao atorID <<FK>> id <<PK>> nome nascimento © LES/PUC-Rio
Mapeamento – one-to-one © LES/PUC-Rio
Modelo relacional cadastros atores id <<PK>> email username senha id <<FK>> nome nascimento © LES/PUC-Rio
Mapeamento – uso de Coleções java.util.Set, java.util.Collection, java.util.List, java.util.Map, java.util.SortedSet, java.util.SortedMap... © LES/PUC-Rio
Modelo relacional papeis comunidades id <<PK>> nome descricao comunidadeID <<FK>> id <<PK>> nome descricao atorID <<FK>> © LES/PUC-Rio
Mapeamento – List – many-to-many © LES/PUC-Rio
Mapeamento – many-to-many © LES/PUC-Rio
Modelo relacional papeis atores ator_papel id <<PK>> nome descricao comunidadeID <<FK>> id <<PK>> nome nascimento atorID <<FK>> papelID <<FK>> © LES/PUC-Rio
Mapeamento - Herança Estratégia de estrutura genérica não utilizada Três estratégias Tabela por hierarquia Tabela por subclasse Tabela por classe concreta Recurso Polimorfismo implícito © LES/PUC-Rio
Tabela por hierarquia Precisa determinar um discriminator © LES/PUC-Rio
Modelo relacional Ator id <<PK>> nome nascimento escola ano ocupacao salario TIPO_DE_ATOR © LES/PUC-Rio
Tabela por subclasse © LES/PUC-Rio
Modelo relacional Estudante Ator Trabalhador atorID <<FK>> escola ano id <<PK>> nome nascimento atorID <<FK>> ocupacao salario © LES/PUC-Rio
Tabela por classe concreta © LES/PUC-Rio
Modelo relacional Trabalhador Estudante id <<PK>> nome nascimento ocupacao salario id <<PK>> nome nascimento escola ano © LES/PUC-Rio
Tabela por classe concreta – polimorfismo implicito © LES/PUC-Rio
Configuração hibernate.properties ou hibernate.cfg.xml Driver, localização do banco, senha, mapeamentos, etc. © LES/PUC-Rio
Resultado Um arquivo de mapeamento por classe persistente Um arquivo de configuração © LES/PUC-Rio
Arquitetura Detalhada © LES/PUC-Rio
Arquitetura Detalhada © LES/PUC-Rio
SessionFactory (org.hibernate.SessionFactory) Threadsafe Montada a partir do arquivo de configuração (hibernate.cfg.xml) Fábrica de Session Geralmente se usa uma por aplicação © LES/PUC-Rio
Arquitetura Detalhada © LES/PUC-Rio
Session (org.hibernate.Session) Representa a troca de informações entre a aplicação e um esquema de armazenamento de dados Fábrica de transações Wrapper para conexões JDBC Cache de objetos persistentes © LES/PUC-Rio
Aplicação Exemplo Uma aplicação onde é possível Manter atores Cadastrar novos Editar existentes Manter Comunidades Cadastrar novas Adicionar novos papeis Gerenciar Papeis Consultar atores Consultar Comunidades Modelo © LES/PUC-Rio
Copiar bibliotecas Copiar as bibliotecas necessárias para o funcionamento do hibernate © LES/PUC-Rio
Criando o banco Configuration SchemaExport Busca o arquivo hibernate.cfg.xml no classpath SchemaExport Classe usada para criar o esquema do banco de dados É necessário a existência de um banco com o nome especificado na configuração © LES/PUC-Rio
Trabalhando com classes persistentes SessionFactory hibernate.cfg.xml Configuration cria save Session BANCO P1 A1 C1 delete P2 © LES/PUC-Rio
Criando uma Session Criando uma SessionFactory Criando uma Session © LES/PUC-Rio
Demarcação de transação Fronteiras de transação são obrigatórias Envolve 4 passos básicos iniciar transação dar o commit na transação tratar erros fechar sessão © LES/PUC-Rio
Tornando um objeto persistente Novas instancia são consideradas transientes Usa-se o comando save para tornar um objeto persistente Ao salvar o seu id é gerado Se o objeto contiver associação com outros objetos é preciso salva-los antes (ou usar cascade) © LES/PUC-Rio
Carregando um objeto Pode usar dois comandos load Get Lança exceção Retorna nulo © LES/PUC-Rio
Consultando objetos HQL Criteria SQL Linguagem de consulta orientada a objeto Criteria Uma API orientada a objeto para busca SQL © LES/PUC-Rio
HQL © LES/PUC-Rio
Paginação Usado para determinar fronteiras no resultado Útil para evitar desperdício de memória. Ex.: Google © LES/PUC-Rio
Externalizando queries Queries são declaradas nos mapeamentos Não mistura código de consulta com o da aplicação © LES/PUC-Rio
Criteria API Mais próximo de desenvolvedores que não conhecem linguagens de consulta © LES/PUC-Rio
Alterando objetos persistentes © LES/PUC-Rio
Tornando os objetos transientes Remove o objeto do banco Cuidado para não resultar em violação de integridade Exemplo: ao remover um ator seu cadastro deve ser removido também © LES/PUC-Rio
Persistência transitiva As operações (save, delete, update) realizadas com o banco podem resultar em perda de integridade O Hibernate possui mecanismos para tratar relações do tipo pai/filho automaticamente Ex.: Ao remover um ator do banco não faz sentido manter o cadastro do ator © LES/PUC-Rio
Carga preguiçosa Carga dos objetos é feita apenas quando necessário Evita sobrecarregar a memória com objetos não necessários Hibernate usa proxies das coleções Java Pode ser difícil de se trabalhar (LazyInitializationException) © LES/PUC-Rio
Boas práticas e padrões Uso de DAOs (Generic DAOs) Patterns Session-per-request Uma sessão é aberta no inicio de uma requisição e fechada ao final Implementada com ServletFilter Anti-patters Session-per-operation Uma sessão é aberta para cada operação executada © LES/PUC-Rio
Exercícios Trabalhar a “auto-didática” Referência do Hibernate bastante completa: http://www.hibernate.org http://www.hibernate.org/hib_docs/v3/reference/en/html/ Suponha uma aplicação para fazer o controle de gastos. Nela seria possível cadastrar entradas de credito ou débito que determinado indivíduo realizou. Cada entrada possui um valor, uma data e uma categoria. Deve ser possível Registrar categorias Verificar quanto foi gasto em determinada categoria em determinado intervalo de tempo Verificar qual foi a percentagem que determinada categoria gastou em determinado intervalo de tempo Não se preocupe com Interface Controle de usuários © LES/PUC-Rio