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
Download

Document