Disciplina de Projeto de Banco de Dados Professora: Maria Lencastre Grupo: José Sandro, Iago Alves, Cristiano Moura, Rennan Lacerda Respostas do questionário de Hibernate 1. Persistência é quando um objeto (Dados) permanece, mesmo após o término da execução do programa. A sua importância se deve ao fato de termos a necessidade do armazenamento confiável e coerente das informações em um sistema de armazenamento de dados 2. As alternativas básicas são: a. Dados na memória b. Dados em arquivos c. Dados sob controle de um BD Muitas aplicações requerem necessariamente os serviços de um BD, mas algumas podem funcionar bem com uma alternativa mais simples 3. A idéia da persistência O/R é reunir as vantagens de se utilizar um modelo orientado a objetos para a construção de uma aplicação, com a performance e a confiabilidade dos bancos de dados relacionais. No hibernate, tomamos os nomes dos atributos das classes básicas, beans, relacionados aos campos da tabela que está mapeada. 4. O hibernate facilita e muito devido à praticidade na questão tanto da configuração ou quanto a um estilo de mapeamento, além de fornecer drivers e bibliotecas para a sua utilização. O tempo de produção de certas classes e o relacionamento com o banco de dados caiu consideravelmente. A dificuldade está em se habituar ao estilo de referenciamento(mapeamento) utilizado no .xml ou no annotation. 5. RoundTripping A noção de roundtripping é a de que a partir de um dos três elementos: Classes Java Documento de mapeamento Banco de Dados É suficiente para produzir os outros dois Hbm2dll Geração do schema do banco de dados com base no mapeamento em xml. Classe Java necessária ◦ net.sf.hibernate.tool.hbm2ddl.SchemaExport Problemas de padronização (nome de colunas,tabelas e etc..) com DBA´s Normalmente usado em abordagens top-down Hbm2Java Ferramenta do hibernate para a geração de classes persistentes. Sua classe principal é: ◦ net.sf.hibernate.tool.hbm2java.CodeGenerator Suporta duas opções ◦ Output: Seta o diretório para o código gerado ◦ Config: Seta um arquivo de configuração Deve ser usado para: Geração de classes POJO a partir de arquivos de mapeamento criados a partir de abordagens Middle-out de desenvolvimento ou criados pelo Middlegen de uma base existente Middlegen Quando o desenvolvedor tem que trabalhar com um schema existente, uma opção é gerar o mapeamento a partir do schema existente Especialmente útil com muitas tabelas Utiliza-se o Middlegen para gerar um esqueleto do mapeamento que será customizado à mão XDoclet Com um desenvolvimento Top-Down, inicia-se escrevendo classes Java XDoclet lê os meta-atributos e cria o mapeamento hibernate baseado neles. Suas tags sempre têm a sintaxe: @hibernate.tagname (optional) attributes 6. As abordagens são as seguintes: a. Top-down onde se inicia com um Java domain model existente Existe a liberdade total em relação ao schema do banco de dados. É criado um documento de mapeamento (XML) Utilizando um XML editor ou Xdoclet Então a ferramenta hbm2ddl gerará o schema do banco de dados b. Bottom-Up que inicia-se com um banco de dados pré-existente. Utiliza-se o Middlegen para gerar documentos de mapeamento para o Hibernate É executado o hbm2java para gerar o esqueleto das classes POJO Normalmente será necessário um melhoramento do mapeamento feito a mão, pois nem todas associações de classe poderão ser automaticamente mapeadas no banco c. Middle-Out: Quando nem as classes em java, nem o banco de dados contém informação suficiente para a completa geração do ORM Então para gerar o documento de mapeamento do hibernate, serão necessárias entradas extras do usuário Utilizando Xdoclet,a informação é provida por atributos Xdoclet embuídos no código fonte. No caso do Middlegen é provido através da Middlegen GUI d. Meet in the Middle: Um dos cenários mais complexos, combina a existência de classes java e de um banco de dados. Provavelmente utilizar hibernate implicará em mudança em ambos os lados O documento de mapeamento tem que ser feito à mão 7. P or seis maneiras, são elas: Navegação do grafo de objetos Recuperação por identificador HQL Utilizando a API Criteria Query by example Usando SQL nativo 8. Imagine essa estrutura ao lado Código em Java com Sql String sql = " select sv.id, a.familia, a.especie”+ +“from serVivo sv inner join”+ +“animal a on sv.id = a.id;” PreparedStatement statment = conexao.prepareStatement(sql); ResultSet result = statment.executeQuery(); Lis<Animal> lista = new ArrayList<Animal>(); while (result.next()) { Animal animal = new Animal(); SerVivo ser = new SerVivo(); animal.setId(result.getInt("id")); animal.setFamilia(result.getString("familia")); animal.setEspecie(result.getString(“especie”)); lista.add(animal); } statment.execute(); statment.close(); 9. Ainda com a mesma estrutura a busca com Hibernate private final Session sessao; Transaction transacao = null; public Animais_DAO() { this.sessao = Hibernate_Util.getSessao(); } . . . @Override public List procurar() { Transaction transacao = sessao.beginTransaction(); List lista_animais = sessao.createQuery("from Animal").list(); return lista_animais; } Deixando de lado as formas de implementação de orientação a objetos, as consultas com utilizando o hibernate HQL são muito mais sintéticas e práticas ao contrário do SQL com o estilo tradicional. O HQL foi projetado para ser simples e poderoso. Nesse exemplo a referencia da classe mapeada já é sufuciente para retornar os dados no caso do HQL enquanto a query do SQL é muito maior.