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 • guid • identity • native • sequence • assigned • hilo • select • seqhilo • foreign • uuid © 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 • <many-to-one – name – class – column © LES/PUC-Rio Modelo relacional comunidades atores id <<PK>> id <<PK>> nome nome descricao nascimento atorID <<FK>> © LES/PUC-Rio Mapeamento – one-to-one © LES/PUC-Rio Modelo relacional cadastros atores id <<PK>> id <<FK>> email nome username nascimento senha © 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>> id <<PK>> nome nome descricao descricao atorID <<FK>> comunidadeID <<FK>> © LES/PUC-Rio Mapeamento – List – many-to-many © LES/PUC-Rio Mapeamento – many-to-many © LES/PUC-Rio Modelo relacional atores ator_papel id <<PK>> atorID <<FK>> nome papelID <<FK>> nascimento papeis id <<PK>> nome descricao comunidadeID <<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>> id <<PK>> atorID <<FK>> escola nome ocupacao ano nascimento salario © LES/PUC-Rio Tabela por classe concreta © LES/PUC-Rio Modelo relacional Trabalhador Estudante id <<PK>> id <<PK>> nome nome nascimento nascimento ocupacao escola salario 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 • Editar existentes • 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 – 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 cria Configuration save Session P1 C1 P2 BANCO A1 delete © 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 • Lança exceção – Get • Retorna nulo © LES/PUC-Rio Consultando objetos • HQL – 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