Universidade de Pernambuco Escola Politécnica de Pernambuco 2º Exercício Escolar – Projeto de Banco de Dados Tema: Hibernate Equipe: Ed Prado, Elton Oliveira, Marlon Chalegre, Rodrigo Castro O que é persistência de dados? Qual a importância da persistência de dados? O termo persistência de dados consiste na característica dos dados de serem acessíveis além do tempo de execução das aplicações que os utilizam. Eles ficam armazenados em algum meio que possibilite sua recuperação posterior. O ato de atribuir essa característica as dados denomina-se persistir dados. Esta é uma característica fundamental para qualquer aplicação, pois permite, por exemplo, que uma aplicação interaja com seus usuários mesmo quando a aplicação é fechada e aberta novamente como um novo processo da máquina. Dê exemplos de maneiras usadas por aplicações nas mais diversas tecnologias para se persistir dados. Dados podem persistir em arquivos de textos, arquivos binários ou banco de dados. O que é o mapeamento objeto-relacional (ORM)? Como ele é feito no hibernate? O Mapeamento OR é uma técnica de desenvolvimento que consiste em representar o objeto de maneira relacional na gravação do banco de dados, e consegue fazer o caminho inverso sem perder informação. No hibernate, esse mapeamento é feito através de arquivos XML que descrevem como os objetos da aplicação devem ser mapeados para o modelo relacional do banco de dados utilizado pela aplicação. O hibernate também permite que o mapeamento seja feito na própria classe do objeto através do uso de annotations. Como o hibernate facilita o trabalho do programador? Quais são as dificuldades? O hibernate impõe ao programador algum estilo específico de codificação? O objetivo do Hibernate é diminuir a complexidade entre os programas Java, baseado no modelo orientado a objeto, que precisam trabalhar com um banco de dados do modelo relacional (presente na maioria dos SGDBs). Em especial, no desenvolvimento de consultas e atualizações dos dados. O Hibernate, portanto, facilita a criação de sistemas que desejam utilizar o mapeamento OR, sendo o Hibernate responsável por realizar o mapeamento reduzindo a quantidade de linhas de códigos necessárias para realizar tal funcionalidade e facilitando a consulta, inserção e atualização dos dados no banco. Como toda ferramenta, a dificuldade de se usar o hibernate é ter que aprender como ele trabalha. Aprender a descrever o mapeamento de objetos para o modelo relacional, aprender a linguagem HQL, aprender como instanciar o hibernate, dentre outras atividades mais avançadas. O hibernate impõe sim um estilo de codificação específico. Ele exige do programador que toda classe que for ser persistida por ele tenha um construtor vazio e os métodos get e set para todos os seus atributos. Quais as principais ferramentas do hibernate e quais são suas funções? HBM2DLL – Ferramenta utilizada para gerar o schema do banco de dados a partir do arquivo xml de configuração. HBM2Java – Ferramenta utilizada para criação de classes que possam persistir em banco de dados. Middlegen – Ferramenta utilizada para gerar o arquivo de configuração a partir de um schema de banco de dados pré-definido. Xdoclet – Ferramenta utilizada para criação dos arquivos de mapeamento a partir de classes préexistentes. Cite as abordagens de desenvolvimento de aplicações com hibernate e explique cada uma delas. Top-down – Nesta abordagem o desenvolvimento do sistemada se da utilizando um Java domain model. Após o sistema ser desenvolvido utiliza-se as ferramentas Xdoclet e hbm2dll para gerar o mapeamento das classes e o schema do banco de dados (essas duas ações podem ser realizadas manualmente). Bottom-Up – Esta abordagem um banco de dados pré-existente é utilizado. As ferramentas middlegen e hbm2java são utilizadas para gerar o mapeamento dos objetos para o hibernate e para gerar o esqueleto das classes java. O resultado obtido através das ferramentas deverá ser melhorado manualmente. Middle-Out – Os arquivos de mapeamento do Hibernate são gerados a partir de informações adicionais fornecidos pelo usuário quando nem as classes e nem o banco de dados existentes conseguem fornecer informações suficientes. Meet in the Middle – O método mais complexo. É baseado na pré existência tando de classes como do banco de dados. Todo o arquivo de configuração do mapeamento deve ser gerado pelo usuário. De que maneiras através do hibernate pode ser feita a recuperação de objetos? Há basicamente 6 maneiras distintas de recuperar objetos no Hibernate, a saber: navegando pelo grafo de objetos, recuperando objetos pelo identificador, utilizando de HQL (Hibernate Query language – Dialeto SQL para Hibernate, totalmente orientado a objetos), Utilizando a Criteria API (API simplificada para a recuperação de entidades pela composição de objetos Criterion), Consultando mediante um exemplo e, por fim, utilizando SQL nativo. Dê um exemplo código em Java para recuperação de objetos usando SQL, em que seja necessário um produto cartesiano de pelo menos duas tabelas. public class Exemplo { private Connection conn; public void abrirConexao() throws SQLException,NamingException,ClassNotFoundException{ if(conn !=null) return; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/exemplo","root",""); } public Result getDados() throws SQLException, NamingException, ClassNotFoundException{ try{ abrirConexao(); Statement stmt = conn.createStatement(); ResultSet result = stmt.executeQuery( "SELECT * FROM Pessoas p, Endereco e WHERE p.id = e.id"); return ResultSupport.toResult(result); }finally{ fecharConexao(); } } public void fecharConexao() throws SQLException{ if(conn == null)return; conn.close(); conn = null; } } Dê um exemplo de recuperação de objetos para o mesmo caso do item anterior, mas desta vez usando o hibernate. Na sua opinião, qual das duas é a melhor maneira? public class Exemplo { public List getDados() { Session newSession = HibernateUtil.getSessionFactory().openSession(); Transaction newTransaction = newSession.beginTransaction(); List messages = List result = newSession.createQuery("from Pessoa p, Endereco e where p.id = e.id").list(); newTransaction.commit(); newSession.close(); return result; } } É melhor usar o Hibernate porque ele permite que o programador trabalhe em um nível de abstração mais alto.