Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM...
Transcript of Salvador Dali. The Persistence of Memory. 1931 1 Parceria Borland / ITA MODELOS DE PERSISTÊNCIA EM...
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
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
3 Parceria Borland / ITA
Roteiro
A. Modelos de Persistência em Java
B. Introdução ao Hibernate
4 Parceria Borland / ITA
Salvador Dali. The Persistence of Memory. 1931
A. Modelos de Persistência em Java
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.
6 Parceria Borland / ITA
Os 5 Frameworks de Persistência
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.
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.
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.
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.
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).
12 Parceria Borland / ITA
Salvador Dali. The Persistence of Memory. 1931
B. Introdução ao Hibernate
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
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.
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.
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
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
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
19 Parceria Borland / ITA
2º Passo: Modelar as classes de entidade a serem persistidasDiagrama das Classes de Entidades
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>
+
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.
22 Parceria Borland / ITA
3º Passo: Criar as classes de acesso a dados.
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; }}
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.
25 Parceria Borland / ITA
Perguntas
Exemplo Simples de uma Aplicação Hibernate www.redecasd.ita.
br/rmoura/lectures/Borcon2004-Hibernate.zip