Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM...

26
1 Parceria Borland / ITA 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

Transcript of Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM...

Page 1: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

1 Parceria Borland / ITA

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

Page 2: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

2 Parceria Borland / ITA

Objetivos

• Apresentar as principais soluções de persistência em Java

• Realizar tutorial do Hibernate

• Compartilhar ExperiênciasSalvador Dali. The Persistence of Memory. 1931

Page 3: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

3 Parceria Borland / ITA

Roteiro

A. Modelos de Persistência em Java

B. Introdução ao Hibernate

Page 4: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

4 Parceria Borland / ITA

Salvador Dali. The Persistence of Memory. 1931

A. Modelos de Persistência em Java

Page 5: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

5 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.

Page 6: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

6 Parceria Borland / ITA

Os 5 Frameworks de Persistência

Page 7: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

7 Parceria Borland / ITA

Solução # 1 : JDBC

Vantagens

JDBC

Desvantagens

• Tecnologia Testada e largamente utilizada;• Rápida execução;• Permite acesso a características proprietárias dos Banco de Dados; e• Não necessita de contêiner de aplicação.

• 30 % do código da aplicação gasto com JDBC;• Todas as função CRUD (Create, Retrieve, Update and Delete) precisam ser codificadas;• Código JDBC não é portável; e• Não possui suporte para herança e polimorfismo de objetos.

Page 8: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

8 Parceria Borland / ITA

Solução # 2 : EJB ( Entity Beans)

Vantagens

EJB ( Entity Beans)

Desvantagens

• API padronizada;• Suporte de ferramentas dos principais fornecedores;• Provê características adicionais a persistência de dados; e• Arquitetura de processamento distribuído.

•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.

Page 9: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

9 Parceria Borland / ITA

Solução # 3 : ORM

Vantagens

ORM

Desvantagens

• Baseados em tecnologias

maduras: JDBC e BD Relacional;• Desempenho semelhante a código

JDBC manual;• Suporta herança e polimorfismo;• Suporta queries dinâmicas; e• Não necessita de modificação de

bytecode.

•Falta de API padronizada; e•Suporte limitado a stored

procedures.

Page 10: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

10 Parceria Borland / ITA

Solução # 4 : JDO

Vantagens

JDO

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.

Page 11: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

11 Parceria Borland / ITA

Solução # 5 : Serialization

Vantagens

Serialization

Desvantagens

• Altíssima performance; e

• Simplicidade.

• Portabilidade para outras

linguagens; e

• Limitações quando a disponibilidade

de memória (Prevayler).

Page 12: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

12 Parceria Borland / ITA

Salvador Dali. The Persistence of Memory. 1931

B. Introdução ao Hibernate

Page 13: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

13 Parceria Borland / ITA

Hibernate: é um software livre de mapeamento objeto-relacional (ORM) para Java.

Models de Dados OO

• Classes• Instâncias

Modelo de Dados Relacional

• Tabelas• Registros

Ferramentas ORM

Page 14: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

14 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.

Page 15: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

15 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.

Page 16: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

16 Parceria Borland / ITA

Arquitetura

Sco

po

de

gli

in

terv

enti

Arq

uit

eura

Scopo degli interventiAplicação Hibernate

Item Exemplo

Biblioteca Hibernate hibernate2.jar

Arquivo de configuração

hibernate.properties

Classe de Entidade Java

Jogador.java

XML de Mapeamento Jogador.hbm.xml

Classe de Acesso a Dados

DAOHibernate.java

1

2

3

4

5

Page 17: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

17 Parceria Borland / ITA

Criando uma Aplicação com o Hibernate

1º Passo: Instalar e configurar o Hibernate•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•Carregar configuração do Hibernate•Abrir sessão•Realizar operação

1

2

3

Page 18: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

18 Parceria Borland / ITA

1º Passo: Instalar e configurar o Hibernate

hibernate.properties

## HypersonicSQL

hibernate.dialect net.sf.hibernate.dialect.HSQLDialecthibernate.connection.driver_class org.hsqldb.jdbcDriverhibernate.connection.username sahibernate.connection.password sahibernate.connection.url jdbc:hsqldb:hsql://localhost

Page 19: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

19 Parceria Borland / ITA

2º Passo: Modelar as classes de entidade a serem persistidasDiagrama das Classes de Entidades

Page 20: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

20 Parceria Borland / ITA

2º Passo: Modelar as classes de entidade a serem persistidas

Jogador.javapackage br.ita.borcon.entity;/**@hibernate.class table="Jogador" dynamic-update="true" */public class Jogador { private long id = -1; private String nome; private Time time;

public Jogador() { }

/** @hibernate.id generator-class="increment" column="jog_id" unsaved-value="-1" */ public long getId() { return id; } /** @hibernate.property column="jog_nome" not-null="true" */ public String getNome() { return nome; }

/** @hibernate.many-to-one column="tim_id" cascade="all" */ public Time getTime() { return time; } public void setId(long id) { this.id = id; } public void setNome(String nome) { this.nome = nome; } public void setTime(Time time) { this.time = time; } }

Jogador.hbm.xml<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping> <class name="br.ita.borcon.entity.Jogador" table="JOGADOR" dynamic-update="true" dynamic-insert="false" >

<id name="id" type="long" unsaved-value="-1" > <generator class="increment"/> </id>

<property name="nome" type="java.lang.String" update="true" insert="true" column="jog_nome" length="80" not-null="true" />

<many-to-one class="br.ita.borcon.entity.Time“name="time" cascade="all" outer-join="auto" update="true" insert="true" column="tim_id" />

</class></hibernate-mapping>

+

Page 21: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

21 Parceria Borland / ITA

2º Passo: Modelar as classes de entidade a serem persistidas

Jogador.javapackage br.ita.borcon.entity;/**@hibernate.class table="Jogador" dynamic-update="true" */public class Jogador { private long id = -1; private String nome; private Time time;

public Jogador() { }

/** @hibernate.id generator-class="increment" column="jog_id" unsaved-value="-1" */ public long getId() { return id; } /** @hibernate.property column="jog_nome" not-null="true" */ public String getNome() { return nome; }

/** @hibernate.many-to-one column="tim_id" cascade="all" */ public Time getTime() { return time; } public void setId(long id) { this.id = id; } public void setNome(String nome) { this.nome = nome; } public void setTime(Time time) { this.time = time; } }

Jogador.hbm.xml<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping> <class name="br.ita.borcon.entity.Jogador" table="JOGADOR" dynamic-update="true" dynamic-insert="false" >

<id name="id" type="long" unsaved-value="-1" > <generator class="increment"/> </id>

<property name="nome" type="java.lang.String" update="true" insert="true" column="jog_nome" length="80" not-null="true" />

<many-to-one class="br.ita.borcon.entity.Time“name="time" cascade="all" outer-join="auto" update="true" insert="true" column="tim_id" />

</class></hibernate-mapping>

Importante !

Id == -1 para instância não persistida

A classe deve possuir construtor sem parâmetros.

Page 22: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

22 Parceria Borland / ITA

3º Passo: Criar as classes de acesso a dados.

Page 23: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

23 Parceria Borland / ITA

3º Passo: Criar as classes de acesso a dados

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(); // Inicia uma nova transação (opcional) Transaction tx = s.beginTransaction(); Object aObject = s.load(classType, new Long(id)); tx.commit(); s.close(); return aObject; }

DAOHibernate.java

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); tx.commit(); s.close(); return queryResult; }}

Page 24: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

24 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.

Page 26: Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM JAVA Ronaldo Carvalho Moura Júnior Engenharia de Computação.

26 Parceria Borland / ITA

Obrigado!

<<Favor preencher a ficha de avaliação>>

[email protected]