Salvador Dali. The Persistence of Memory. 1931 MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação Centro de Excelência Borland no ITA 1 Parceria Borland / ITA Objetivos • Apresentar as principais soluções de persistência em Java • Realizar tutorial do Hibernate Salvador Dali. The Persistence of Memory. 1931 • Compartilhar Experiências 2 Parceria Borland / ITA Roteiro A. Modelos de Persistência em Java B. Introdução ao Hibernate 3 Parceria Borland / ITA Salvador Dali. The Persistence of Memory. 1931 A. Modelos de Persistência em Java 4 Parceria Borland / ITA Definição Persistência em Java pode ser definida como a manutenção do estado de objetos de uma aplicação em um armazenamento não-volátil, durante múltiplas execuções da JVM sujeitas a falhas do sistema e da aplicação. 5 Parceria Borland / ITA Os 5 Frameworks de Persistência 6 Parceria Borland / ITA Solução # 1 : JDBC JDBC Vantagens Desvantagens • 30 % do código da aplicação gasto • Tecnologia Testada e largamente com JDBC; utilizada; • Todas as função CRUD (Create, • Rápida execução; Retrieve, Update and Delete) • Permite acesso a características precisam ser codificadas; proprietárias dos Banco de Dados; e • Código JDBC não é portável; e • Não necessita de contêiner de • Não possui suporte para herança e aplicação. polimorfismo de objetos. 7 Parceria Borland / ITA Solução # 2 : EJB ( Entity Beans) EJB ( Entity Beans) Vantagens Desvantagens •Necessitam de uma grande variedade de Design Patterns; • Verbosa: necessita de vários arquivos para cada entidade; • EJB QL é estática; •Não possui suporte a herança / polimorfismo; e • Não suporta entidades de granularidade fina. • API padronizada; • Suporte de ferramentas dos principais fornecedores; • Provê características adicionais a persistência de dados; e • Arquitetura de processamento distribuído. 8 Parceria Borland / ITA Solução # 3 : ORM ORM Vantagens Desvantagens • Baseados em tecnologias maduras: JDBC e BD Relacional; • Desempenho semelhante a código JDBC manual; •Falta de API padronizada; e • Suporta herança e polimorfismo; •Suporte limitado a stored procedures. • Suporta queries dinâmicas; e • Não necessita de modificação de bytecode. 9 Parceria Borland / ITA Solução # 4 : JDO JDO Vantagens Desvantagens • API padronizada; • Suporte a herança e polimorfismo; • Funcionalidades de consultas avançada: JDOQL ; • Não necessita de contêiner de aplicação; e •Integração com varianda gama de fontes de dados; • Tecnologia pouco madura. • Necessita de modificação do bytecode; • A especificação JDO 2.0 não está completa; e • Atualmente requer extensões proprietárias para mapeamento O/R. 10 Parceria Borland / ITA Solução # 5 : Serialization Serialization Vantagens Desvantagens • Portabilidade para outras • Altíssima performance; e linguagens; e • Simplicidade. • Limitações quando a disponibilidade de memória (Prevayler). 11 Parceria Borland / ITA Salvador Dali. The Persistence of Memory. 1931 B. Introdução ao Hibernate 12 Parceria Borland / ITA Hibernate: é um software livre de mapeamento objetorelacional (ORM) para Java. Modelo de Dados Relacional Models de Dados OO Ferramentas ORM • Tabelas • Registros • Classes • Instâncias 13 Parceria Borland / ITA Características do Hibernate Mapeamento objeto-relacional flexível: – representação de herança em 3 formas; – cascateamento configurável de operações; – associaçoes bidirecionais e polimórficas: many-to-one, many-to-many e outras; Geração automática de chave primária: – métodos: sequence, hilo, uuid, foreign, native e outros. Alta performance – Suporte a lazy inicialization de coleções e objetos; – overhead < 10% em relação ao JDBC; – Opção de optimistic locking. 14 Parceria Borland / ITA Características do Hibernate Suporte a dialetos de vários banco de dados: – DB2, PostgreSQL, MySQL, Oracle, SAP DB, HypersonicSQL, Interbase, Firebird e outros Linguaguens de consulta suportadas: – Dialeto SQL nativo de seu banco de dados; – HQL :linguagem de consulta OO semelhante ao SQL e independente de banco de dados. 15 Parceria Borland / ITA Arquitetura Scopo degli Hibernate interventi Aplicação degli interventi ScopoArquiteura Item 16 Exemplo 1 Biblioteca Hibernate hibernate2.jar 2 Arquivo de configuração hibernate.propertie s 3 Classe de Entidade Java Jogador.java 4 XML de Mapeamento Jogador.hbm.xml 5 Classe de Acesso a Dados DAOHibernate.jav a Parceria Borland / ITA Criando uma Aplicação com o Hibernate 1º Passo: Instalar e configurar o Hibernate 1 2 • Download do site http://www.hibernate.org • Colocar no diretório /lib o arquivo jar do driver JDBC. • Editar hibernate.properties e configurá-lo para o seu banco de dados. 2º Passo: Modelar as classes de entidade a serem persistidas • Criar as classes de entidades com métodos get e set para cada atributo (JavaBean) • Criar os arquivos de mapeamento XML para cada classe de entidade. 3º`Passo: Criar as classes de acesso a dados 3 • Carregar configuração do Hibernate • Abrir sessão • Realizar operação 17 Parceria Borland / ITA 1º Passo: Instalar e configurar o Hibernate hibernate.properties ## HypersonicSQL hibernate.dialect net.sf.hibernate.dialect.HSQLDialect hibernate.connection.driver_class org.hsqldb.jdbcDriver hibernate.connection.username sa hibernate.connection.password sa hibernate.connection.url jdbc:hsqldb:hsql://localhost 18 Parceria Borland / ITA 2º Passo: Modelar as classes de entidade a serem persistidas Diagrama das Classes de Entidades 19 Parceria Borland / ITA 2º Passo: Modelar as classes de entidade a serem persistidas Jogador.java Jogador.hbm.xml package br.ita.borcon.entity; /**@hibernate.class table="Jogador" dynamicupdate="true" */ public class Jogador { private long id = -1; private String nome; private Time time; <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping + public Jogador() { } <hibernate-mapping> <class name="br.ita.borcon.entity.Jogador" table="J <id name="id" type="long" unsaved-value="-1" > <generator class="increment"/> </id> /** @hibernate.id generator-class="increment" column="jog_id" unsaved-value="-1" */ public long getId() { return id; } <property name="nome" type="java.lang.String" <many-to-one class="br.ita.borcon.entity.Time“na column="tim_id" /> /** @hibernate.property column="jog_nome" notnull="true" */ public String getNome() { return nome; } </class> </hibernate-mapping> /** @hibernate.many-to-one column="tim_id" 20 Parceria Borland / ITA 2º Passo: Modelar as classes de entidade a serem persistidas Jogador.java Jogador.hbm.xml package br.ita.borcon.entity; /**@hibernate.class table="Jogador" dynamicupdate="true" */ public class Jogador { private long id = -1; A classe deve possuir private String nome; construtor sem parâmetros. private Time time; <?xml version="1.0"?> public Jogador() { } /** @hibernate.id generator-class="increment" column="jog_id" unsaved-value="-1" */ public long getId() { return id; } <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping <hibernate-mapping> <class name="br.ita.borcon.entity.Jogador" table="J <id name="id" type="long" unsaved-value="-1" > <generator class="increment"/> Id == -1 para instância </id> não persistida Importante ! <property name="nome" type="java.lang.String" <many-to-one class="br.ita.borcon.entity.Time“na column="tim_id" /> /** @hibernate.property column="jog_nome" notnull="true" */ public String getNome() { return nome; } </class> </hibernate-mapping> /** @hibernate.many-to-one column="tim_id" 21 Parceria Borland / ITA 3º Passo: Criar as classes de acesso a dados. 22 Parceria Borland / ITA 3º Passo: Criar as classes de acesso a dados DAOHibernate.java import net.sf.hibernate.cfg.*; import net.sf.hibernate.*; public class DAOHibernate implements IDAO { private static SessionFactory factory; public static void loadProgrammaticConfiguration() throws MappingException, HibernateException { Configuration cfg = new Configuration() .addClass(Jogador.class) .addClass(Time.class) .setProperty(Environment.HBM2DDL_AUTO, "create"); DAOHibernate.factory = cfg.buildSessionFactory(); } public Object getEntity(Class classType, long id) throws Exception { // Obtém uma conexão JDBC e instancia uma nova sessão Session s = factory.openSession(); public void saveOrUpdade(Object entity) throws Exception { Session s = factory.openSession(); Transaction tx = null; try { tx = s.beginTransaction(); s.saveOrUpdate(entity); tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); throw e; } finally { s.close(); } } public List getAllJogadores(Time time) throws HibernateException { Session s = factory.openSession(); Transaction tx = s.beginTransaction(); List queryResult = s.find( "from br.ita.borcon.entity.Jogador as jog where jog.time.id=?", new Long(time.getId()), Hibernate.LONG); 23 Parceria Borland / ITA Futuro do Hibernate Hibernate3 previsto para início de 2005 • Novas características do JDK 1.5: Java generics para coleções seguras; • Mapeamento de entidades para stored procedures; e • Maior suporte a design orientado a evento. 24 Parceria Borland / ITA Perguntas Exemplo Simples de uma Aplicação Hibernate www.redecasd.ita.br/rmoura/lectures/Borcon2004-Hibernate.zip 25 Parceria Borland / ITA Obrigado! <<Favor preencher a ficha de avaliação>> [email protected] 26 Parceria Borland / ITA