Hibernate Apresentação Sidney Vilaça Tópicos Conceitos básicos: banco de dados(b.d), orientação a objetos(o.o.) ... Persistência de dados e persistência de objetos e mapeamento O/R. O que é o Hibenate? Exemplo do Hibernate. Persistência de dados em Hibernate. Banco de Dados Bancos de dados (ou bases de dados) são arquivos ou sistemas com uma estrutura regular que organizam informações. Um Banco de Dados Relacional é um sistema de armazenamento de dados baseado nos relacionamentos entre elementos de dados buscando uma normalização (sem redundâncias) dos dados. Persistência de Dados A Persistência de Dados consiste no armazenamento confiável e coerente das informações em um sistema de armazenamento de dados. Persistência de Objetos A Persistência de Objetos é o armazenamento consistente de objetos de uma aplicação o.o. para que estes objetos existam em diferentes execuções de diferentes aplicações. O.O. + B.D. , quadro atual Problema: Temos um aplicativo o.o. que precisa interagir com um banco de dados. O que fazer? Os bancos de dados o.o. ainda têm grandes desvantagens em relação aos relacionais. O padrão vigente nas empresas é o banco de dados relacional, e sem uma perspectivas de mudança. Mapeamento OR, a solução O Mapeamento Objeto-Relacional (OR) é a solução para o problema. 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. Mapeamento OR, como? O mapeamento OR tem 3 componentes Modelo Orientado a objetos, que é o modelo em que os dados estão representados na aplicação, Persistência Física, o modelo relacional em que os dados serão armazenados. Persistência Lógica, que traduz o modelo o.o. para a maneira que eles serão armazenados na persistência física, e vice-versa. Hibernate O Hibernate é uma das soluções mais difundidas para Mapeamento OR em Java. (Outras também famosas são OJB, JDO e o Toplink). Ele está sob a LGPL, ou seja, ele pode ser um usado em código aberto e projetos comerciais. Usam o Hibernate em seus projetos: Sony, AT&T, PwC, Cisco... entre outras empresas. Mapeamento OR em Hibernate O hibernate isola o aplicativo de contato direto com o banco de dados, servindo como ponte entre os dois sistemas. E a melhor parte é que não possui chamadas SQL misturadas ao código Java Ao contrário de outros modelos de mapeamento OR, o hibernate não é intrusivo. Ou seja, ele não obriga o programado a estender uma classe dele no seu aplicativo. Mapeamento OR em Hibernate No Hibernate temos que criar um arquivo de mapeamento que serve como o modelo da persistência lógica. Nele a classe o.o. é descrita de maneira pré-determinada pelo Hibernate, e assim ele monta um b.d. relacional consistente para aquela estrutura o.o. E o arquivo de mapeamento é utilizado para os padrões de escrita e consulta. Persistência de Dados em Hibernate Podemos dividir a persitência de dados do Hibernate em dois tipos: Persistência de objetos simples Persistência de coleções Vantagens Todo objeto a ser persistido pelo Hibernate precisa ter um campo ID, ou chave primária. Apesar de desnecessário no aplicativo, este campo ID irá dar a unicidade do objeto no banco de dados, e irá garantir a sua persistência. Persistência de Dados: Objetos Simples Objetos que podem ser persistidos: Todos os tipos primitivos de java Os objetos gerados pelas classes do pacote java.lang (equivalência a tipos primitivos do B.D.) As classes: java.util.Calendar, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp. Persistência de Dados: Objetos Simples ... As classes: java.util.Calendar, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp. E todas as classes declaradas como persistentes, elas serão iguais á uma chave estrangeira em um B.D. relacional Persistência de Dados: Objetos Simples, exemplo Classe public class private private private CD { String nome; String artista; java.util.Date lancamento; public CD() { } public String getNome(){ return ID; } public void setNome(int nome){ this.nome = nome; } // Sets e Gets public java.util.Date getNascimento(){ return nascimento; } public void setNascimento(java.util.Date lancamento) { this.lancamento = lancamento; } Persistência de Dados: Objetos Simples, exemplo Arquivo de mapeamento da classe (CD.hbm.xml) <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernatemapping.dtd"> <hibernate-mapping> <class name="Amigo" table="amigo"> <id name="nome" column="nome" type="string"> <generator class="assigned"/> </id> <property name="artista" type="string"/> <property name="lancamento" type="date"/> </class> </hibernate-mapping> Persistência de Dados: Coleções Apesar de mapear coleções, cada coleção é mapeada de maneira diferente. Vamos ver como persistir um array e um map. Persistência de Dados: Coleções: Array <array name="teste" table="Teste" cascade="all"> <key column="teste_ID"/> <index column="I"/> <many-to-many column="teste_ID" class="org.hibernate.Foo"/> </array> Persistência de Dados: Coleções: Map <map name="holidays" table="holidays" schema="dbo" order-by="hol_name asc"> <key column="id"/> <index column="hol_name" type="string"/> <element column="hol_date" type="date"/> </map> HQL Hibernate Query Language Para fazer consultas ao banco o Hibernate usa HQL, que apesar do nome, é inteiramente orientado a objetos, entendendo noções como herança e polimorfismo. Ex: select nome from eg.CD as cd join cd.nome as "Ventura" Persistência de Heranças Existem 3 estratégias para mapeamento de heranças: Por Hierarquia Por Subclasse Por Classe Concreta Referências Home Page do Hibernate: http://www.hibernate.org Tutorial http://www.roseindia.net/hibernate/index.shtml Mapeamento OR http://en.wikipedia.org/wiki/Object-relational_mapping FIM