Vous êtes sur la page 1sur 105

Hibernate uma soluo para Mapeamento Objeto/Relacional em aplicaes Java

Nosso Objetivo
Estudar o Hibernate n Apresentar o Hibernate como uma opo para desenvolvimento de aplicaes Java n Ter menos trabalho ao implementar nossas camadas de persistncia J
n

Sumrio
n n n n n n n n n

Introduo Motivao Caractersticas do Hibernate Usando Hibernate Hibernate Query Language (HQL) Integrao com outras ferramentas Quem est usando Hibernate Outras Alternativas para ORM Concluses

Introduo
Hibernate definido como um servio de persistncia de objetos sobre bancos de dados relacionais de maneira transparente. n Ou seja, uma ferramenta para evitar o mapeamento hard-coded entre objetos/atributos x tabelas/campos. n Hibernate uma ferramenta poderosa, de alta performance e com servio de consulta.
n

Introduo
n

Hibernate uma moderna soluo de mapeamento objeto-realcional(ORM)


Persistncia

tranparente (POJO/Java Beans) Lazy Fetching Uso de uma Cache Trs estratgias para o mapeamento de heranas

Introduo

Transparncia
n n

n n

Persistncia sem impacto no cdigo dos objetos de negcio Qualquer classe pode ser uma classe persistente sem ser necessrio implementar nenhuma classe ou interface Classes persistentes podem ser usadas fora do contexto de persistncia (ex Testes) Total portabilidade sem dependncias

Problemas dos BDRs


n

Modelagem
No

h polimorfismo No h herana
n

Lgica de negcio
Stored

procedures -> perca de portabilidade

Vantagens dos RDBs


n n n

Trabalhar com grandes quantidades de dados


Busca,

ordenao e agregaes

Trabalhar com conjuntos de dados


Junes

Compartilhamento
Concorrncia (Transaes) Muitas aplicaes

Integridade
Restries (Constraints) Isolao de transaes

Motivao

Motivao
n

Java possui grande quantidade de frameworks, bibliotecas e ferramentas que facilitam a vida do programador. Boa parte do tempo de desenvolvimento em aplicaes coorporativas gasto na camada de persistncia usada para armazenar e recuperar objetos em bancos de dados. Com o Hibernate o programador pode se preocupar mais com os objetos e menos com a sua forma de persistncia.

Motivao
O Hibernate prov um framework de persistncia poderoso e fcil de usar para aplicaes Java. n Utilizando o Hibernate, o tempo gasto na implementao das camadas de persistncia menor.
n

Caractersticas do Hibernate

Caractersticas
n n n n n

Hibernate open source Regido pelo LGPL (Lesser General Public License) A licena LGPL permite utilizar o Hibernate em aplicaes de cdigo aberto ou comerciais Implementar interfaces ou estender classes do Hibernate considerado normal pelo autor Modificar o Hibernate e re-distribuir o mesmo, est sujeito ao LGPL

Caractersticas
Bem documentado n Comunidade de desenvolvedores e usurios bastante ativa n Aproximadamente quinze mil downloads por ms n Atualmente, a soluo para ORM em Java mais popular
n

Caractersticas
n Suporte

a:

Colees

entre objetos Tipos Compostos n Lazy initialization n Nenhuma tabela especial necessria

Relacionamento

Caractersticas
n Prov:
Cache

eficiente Poderosa linguagem de consultas (HQL) Queries com SQL Nativo

Banco de Dados Suportados


n n n n n n n n n n n n n

DB2 7.1, 7.2, 8.1 MySQL 3.23, 4.0 PostgreSQL 7.1.2, 7.2, 7.3, 7.4 Oracle 8i, 9i Sybase 12.5 (JConnect 5.5) Daffodil DBv3.1 Interbase 6.0.1 (Open Source) with Firebird InterClient 2.01 HypersonicSQL 1.61, 1.7.0 Microsoft SQL Server 2000 Mckoi SQL 0.93 Progress 9 Pointbase Embedded 4.3 SAP DB 7.3

Usando o Hibernate

Passos para usar o Hibernate


n n n n n n

Instalar o Hibernate Criar suas tabelas no BD Criar suas classes bsicas no padro JavaBean Escrever os arquivos de mapeamento Criar o arquivo de propriedades para acesso ao banco de dados Implementar a camada de persistncia com o Hibernate

Instalar o Hibernate
Baixar o .zip (windows) ou .tar.gz (Unix) na pgina http://hibernate.sf.net n A seguinte rvore ser criada:
n

Alguns diretrios da rvore


n

n n

../hibernate-2.1/bin/: ferramentas para gerao e manuteno de esquema de banco de dados a partir de um conjunto de objetos ../hibernate-2.1/doc/: documentao do projeto, incluindo material de consulta para referncia e Javadoc ../hibernate-2.1/lib/: bibliotecas de apoio usadas pelo Hibernate ../hibernate-2.1/src/: cdigo fonte do projeto

Criar suas tabelas no SGBD


create table usuarios ( id int not null, username varchar(20) not null, senha varchar(20) not null, PRIMARY KEY (id) );

Criar suas classes bsicas no padro JavaBean


Classes a serem persistidas no precisam implementar ou estender nenhuma outra classe n Precisam estar no padro JavaBean n Implementar mtodos de acesso e mutao
n
getXXX,

setXXX, isXXX, addXXX, removeXXX

Possuir um construtor default

Boas prticas para classe bsica


Possuir um atributo que funcione como chave-primria n A chave pode ser um tipo primitivo: int, long, char, etc n Um wrapper: java.lang.Integer, java.lang.Long, etc n Ou um java.lang.String ou java.util.Date
n

Exemplo de JavaBean
public class Usuario { private int id; private String username = null; private String password = null; public Usuario() {} public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } ...

Escrever os arquivos de mapeamento


n

n n

Criadas as tabelas no banco e classes de objetos que sero persistidos, precisamos informar ao Hibernate como ser feito o mapeamento entre as classes e as tabelas Criar arquivos xml com o seguinte padro de nome: Objeto.hbm.xml O arquivo xml tambm traz informaes sobre como um objeto se relaciona com outros

Exemplo de *.hbm.xml
n

Usuario.hbm.xml

<hibernate-mapping> <class name="Usuario" table="usuarios"> <id name="id" column="id"> <generator class="assigned"/> </id> <property name="username" column="username"/> <property name="password" column="senha"/> </class> </hibernate-mapping>

Exemplo de mapeamento 1 para N

ibernate-mapping> <class name="example.Team" table="teams"> <id name="id" column="team_id" type="long" unsaved-value="null"> <generator class="hilo"/> </id> <property name="name" column="team_name" type="string" length="15" not-null="true"/> <set name="players" cascade="all" inverse="true" lazy="true"> <key column="team_id"/> <one-to-many class="example.Player"/> </set> </class> hibernate-mapping>

Exemplo de N para 1

class name="example.Player" table="players"> <id name="id" column="player_id" type="long" unsaved-value="null"> <generator class="hilo"/> </id> <property name="firstName" column="first_name" type="string" length="12" not-null="true"/> <property name="jerseyNumber" column="jersey_number type="integer" length="2" not-null="true"/>

<many-to-one name="team" class="example.Team" column="team_id"/> </class>

Exemplo de N para M
<hibernate-mapping> <class name=" Aluno " table=" alunos"> <id name="codigoAluno " column=" codigoAluno "> <generator class=" assigned " /> </id> <property name=" nome" /> <property name=" email" /> <set role="cursos" table=" matricula"> <key column="codigoAluno" /> <many-to-many class="Curso" column="codigoCurso" /> </set> </class> </hibernate-mapping>

Exemplo Locadora
n

Locadora em partes...

Exemplo Locadora
package br.org.citi.pec.locadora;

Classe Persistente
Construtor

default Pares de Gets e Sets Uma propriedade identificadora

public class Filme { private int codigo; private String nome; public int getCodigo() { return codigo; } private void setCodigo(int codigo) { this.codigo = codigo; } public String getNome() { return nome; } private void setNome(int nome) { this .nome = nome; } }

Exemplo Locadora
n

Mapeamento XML
Metadado

legvel Mapeamento de tabelas e colunas


<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="br.org.citi.pec.locadora.Filme" table="filmes"> <id name="codigo" column="filme_id"> <generator class="native" /> </id> <property name="nome" column="nome"/> </class> </hibernate-mapping>

Exemplo Locadora
n

Salvando um objeto
Session session = sessionFactory.openSession(); Transaction tx = s.beginTransaction(); Filme filme = new Filme(); filme.setNome(novoNome); session.save(filme); tx.commit(); session.close();

Tambm pode ser usado saveOrUpdate

Exemplo Locadora
n

Carregando um objeto
Session session = sessionFactory.openSession(); Filme filme = (Filme) session.load(Filme.class, new Integer(filmeId); session.close();

n n

No use load para determinar se um objeto existe (uma exceo lanada neste caso) Use get. Este retorna null caso o objeto no exista

Exemplo Locadora
n

Removendo um objeto
Session session = sessionFactory.openSession(); Transaction tx = s.beginTransaction(); Filme filme = (Filme) session.get(Filme.class, new Integer(filmeId);

session.delete(filme); tx.commit(); session.close();

Exemplo Locadora
n

Atualizando um objeto (Dirty Checking)


Obetendo um filme e alterando seu nome Session session = sessionFactory.openSession();
Transaction tx = s.beginTransaction(); Filme filme = (Filme) session.get(Filme.class, new Integer(filmeId); filme.setNome(novoNome); tx.commit(); session.close();

No necessrio uma chamada explicita do update

Estado dos Objetos


n

Alguns conceitos sobre objetos


Transiente.
n

Nunca persistido. No associado a nenhuma sesso (Session)

Persistente
n

Associado a uma nica sesso

Desacoplado
n

(Detached)

J persistido, mas no associado a nenhuma sesso

Estado dos Objetos


n

Dirty Checking s funciona em objetos persistentes


Use

update para objetos desacoplados

Exemplo Locadora
n

Melhorando nosso modelo...

Exemplo Locadora
n

Classes persistentes
package br.org.citi.pec.locadora; public class Cliente { private String login; private String CPF; private String nome; private Set locacoes = new Hashset(); //... Gets e Sets }

Exemplo Locadora
n

Classes persistentes
package br.org.citi.pec.locadora; public class Locacao { private int id ; private Filme filme; private Cliente cliente; private Date dataLocacao; private Date datadevolucao; //... Gets e Sets }

Exemplo Locadora
n

XML...
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate- mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="br.org.citi.pec.locadora.Cliente" table="Clientes"> <id name="login"/> <property name="nome" /> <property name="cpf" /> <set name="locacoes"> <key column="cliente_login" /> <one-to-many class="br.org.citi.pec.locadora.Locacao"/> </set> </class> </hibernate-mapping>

Exemplo Locadora
n

XML...
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate- mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="br.org.citi.pec.locadora.Locacao" table="Locacoes"> <id name="id"> <generator class="native" /> </id> <property name="dataLocacao" /> <property name="dataDevolucao" /> <many-to-one name="cliente" class="br.org.citi.pec.locadora.Cliente" column="cliente_login"/> <many-to-one name="filme" class="br.org.citi.pec.locadora.Filme" column="filme_id"/> </class> </hibernate-mapping>

Exemplo Locadora
n

Persistncia transitiva
Locacao locacao = new Locacao(); Locacao.setDataLocacao( new Date()); Session session = sessionFactory.openSession(); Transaction tx = s.beginTransaction(); Filme filme = (Filme) session.get(Filme.class, new Integer(filmeId); Cliente cliente = (Cliente) session.get(Cliente.class, login); locacao.setCliente(cliente); locacao.setFilme(filme); cliente.getLocacoes().add(locacao); tx.commit(); session.close();

Otimizando
n

Como as colees so carregadas


Lazy

fetching (Default) Eager (Outer Join) fetching


n

Indicado nos XML, ou na prpria consulta

Lazy fetching
n

SQL escondido:
Cliente cliente = (Cliente) session.get(Cliente.class, login); SELECT FROM CLIENTES C WHERE C.LOGIN = ? Iterator cliente = cliente.getLocacoes().iterate(); SELECT FROM LOCACOES L WHERE L.LOGIN_CLIENTE = ? Filme filme = locacao.getFilme(); SELECT FROM FILMES F WHERE F.FILME_ID = ?

Outer join fetching


n

SQL escondido:

Cliente cliente = (Cliente) session.get(Cliente.class, login); SELECT FROM CLIENTES C


LEFT OUTER JOIN LOCACOES L ON L.LOGIN_CLIENTE = C.LOGIN LEFT OUTER JOIN FILME F ON L.FILME_ID = F.FILME_ID

WHERE C.LOGIN = ?

Herana
n

Estratgias para o mapeamento de herana


Uma

tabela por hierarquia de classes Uma tabela por subclasse Uma tabela por classe concreta

Herana
n

Uma tabela por subclasse


<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate- mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="br.org.citi.pec.locadora.Cliente" table="Clientes"> <id name="login" column="LOGIN" /> ... <joined-subclass name="br.org.citi.pec.locadora.ClienteEspecial" table="ClientesEspeciais"> <key column="LOGIN" /> <property ... /> ... </joined-subclass> </class> </hibernate-mapping>

Otimizando
n

Como otimizar?
Minimizando

a leitura de linhas das tabelas Minimizando a quantidade de comandos SQLs enviados

Otimizando
n

Minimizando a leitura de linhas das tabelas


Usar

lazy fecthing

Minimizando a quantidade de comandos SQLs enviados


Usar

outer join fetching

Otimizando
n

Problemas
Usar
n

lazy fecthing

Problema dos n+1 selects (muitos selects!)

Usar
n

outer join fetching

Problema do produto cartesiano (grandes conjuntos de dados)

Otimizando
n

Solucionando problemas de otimizao


Stratgia

de Fecthing definida em tempo de execuo Batch Fecthing Utilizar um cache de segundo nvel

Schema Export
No diretrio BIN existe uma ferramenta para gerar e/ou atualizar o esquema no SGBD n A gerao feita atravs dos arquivos *.hbm.xml
n

SchemaExport.bat n SchemaUpdate.bat
n

Schema Export
n n n n n n n n n n n n n n

create table teams (team_id BIGINT not null, team_name VARCHAR(15) not null, cit y VARCHAR(15) not null, primary key (team_id)) create table players (player_id BIGINT not null, first_name VARCHAR(12) not null , last_name VARCHAR(15) not null, draft_date DATE, salary FLOAT, jersey_number I NTEGER not null, team_id BIGINT, primary key (player_id)) alter table players add constraint FKE294C1B2AA36363D foreign key (team_id) refe rences teams create table hibernate_unique_key ( next_hi INTEGER ) insert into hibernate_unique_key values ( 0 ) 27/07/2004 19:04:46 net.sf.hibernate.tool.hbm2ddl.SchemaExport execute INFO: schema export complete 27/07/2004 19:04:46 net.sf.hibernate.connection.DriverManagerConnectionProvider close INFO: cleaning up connection pool: jdbc:hsqldb:hsql://localhost

As tabelas no Banco

Arquivo de propriedades para acesso ao banco de dados


n

Para acessar o banco de dados necessrio criar o arquivo


hibernate.properties

n hibernate.dialect O arquivo net.sf.hibernate.dialect.HSQLDialect deve estar no classpath


hibernate.connection.driver_class org.hsqldb.jdbcDriver hibernate.connection.username sa hibernate.connection.password hibernate.connection.url jdbc:hsqldb:hsql://localhost hibernate.connection.pool_size 3

Implementar a camada de persistncia


Primeiramente deve-se ter uma instancia de uma SessionFactory: n SessionFactory armazena o mapeamento dos objetos
n
Configuration cfg = new Configuration() .addClass(Usuario.class); SessionFactory factory = cfg.buildSessionFactory();

Inserindo o objeto na base


n

Para inserir um objeto basta abrir uma sesso e iniciar uma transao
Session session = factory.openSession(); Transaction t = session.beginTransaction();

session.save(usuario);
t.commit(); session.flush(); session.close();

NENHUM comando SQL foi exigido

O que acontece?
Internamente, o Hibernate faz uso de PreparedStatement n Ao ativar a opo hibernate.show_sql true no hibernate.properties possvel visualizar o SQL utilizado no PreparedStatement
n
insert into usuarios (username, senha, id) values (?, ?, ?)

Atualizando um Objeto
n

Para atualizar um objeto o procedimento o mesmo Session session = factory.openSession();


Transaction t = session.beginTransaction();

session.update(usuario);
t.commit(); session.flush(); session.close();

Existe tambm o session.saveOrUpdate(usuario); mtodo saveOrUpdate

Removendo um objeto
n

Instanciar o objeto com o valor da sua chave primria correto


Session session = factory.openSession(); Transaction t = session.beginTransaction();

session.delete(usuario);
t.commit(); session.flush(); session.close();

Restaurando um objeto
n

Para restaurar um objeto, necessrio passar para o Hibernate a classe do objeto e sua chave primria
Session session = factory.openSession(); Usuario usuario = (Usuario)session.load( Usuario.class, new Integer(pk) ); session.flush(); session.close();

Restaurando uma lista de objetos


n

Para retorna uma lista de objetos pode-se usar o mtodo find com um SQL com um pouco modificado Session session = factory.openSession();
StringBuffer buff = new StringBuffer(name); buff.insert(0, '%').append('%'); List usuarios = session.find("from usuarios in class Usuario where usuarios.username like ? ", buff.toString(), Hibernate.STRING); session.flush(); session.close();

Hibernate Query Language

Consultas
n

HIbernate Query Lanuage


Permite

que se expresse quase tudo o que se precisa expressar em SQL, porm mais orientado a objetos

Trs maneiras de se fazer consultas no Hibernate


HQL Criteria SQL

nativo

HQL
n

Tornar SQL orientado a objetos


Classes e propriedades ao invs de Tabelas e colunas Polimorfismo Associaes Joins Projees Funes agregadas e agrupamento Ordenao SubQueries Chamadas a funes SQL

Total suporte a operaes relacionais


HQL
n

A consulta mais simples possivel HQL


from Filme

Devolva todos os filmes

List filmes = session.createQuery(from Filme).list();

n As consultas podem ser paginadas Query query = session.createQuery(from Filme); query.setFirstResult(20); query.setMaxResults(30); List filmes = query.list();

HQL
n

Uma consulta com ordenao


from Locacao l order by l.dataLocacao desc

Caso esteja interessado em um nico resultado

Query query = session.createQuery( from Locacao l order by l.dataLocacao desc); Locacao locacao = query.uniqueResult();

HQL
n

Uma consulta com joins


select c from Cliente c left join [fetch] c.locacaoes l where l.dataLocacao > 3/5/2005

Todos os clientes com suas locaes efetuadas aps o dia 3

Definio da estratgia de fetching


Com o fetch: Colees j inicializadas Sem o fetch: lazy collections

HQL
n n

HQL suporta os mesmos operadores que SQL Operadores do HQL:


Comparao: =, <>, <, >, >=, <=, between, not between, in, not in Nulidade: is null, is not null Aritmticos: +, -, /, *, %, parnteses

n n

O operador like funciona da mesma forma que SQL Pode usar funes SQL se o banco suportar

HQL
n

Projees + funes agregadas (Report Queries)


select c.nome, count(l) from Cliente c, c.locacoes l where l.dataLocacao between(:inicio, :fim) group by c.nome order by count(l)

HQL
n n n

Os dados da consulta anterior sero retornados em List de Object[] Consulta comum para a realizao de relatrios Podemos tornar o processo mais elegante
List list = session.createQuery( select new ClienteReportRow(c.nome, count(l)) + from Cliente c, c.locacoes l + where l.dataLocacao between(:inicio, :fim) + group by c.nome + order by count(l)). setDate(inicion, inicio). setDate(fim, fim).list();

HQL
Dessa evitasse o uso de vetores de objetos n necessrio que exista uma classe e um construtor previamente definido
n

HQL
n

Consultas no precisam aparecer no cdigo


Na verdade, muitas vezes melhor que no apaream Podem ficar nos metadados e serem chamadas pelo nome

Usa-se o mtodo getNamedQuery()


List clientes = session.getNamedQuery(findClienteByName) .setString(nome, nome),list()

Mas antes, ela precisa ser declarada em algum arquivo de mapeamento


<query name=findClienteByName><![CDATA[ from Cliente c where c.nome like :nome]] </query>

Modelagem OO
n

Mais classes que tabelas


Classse
n

Endereco

Propriedade: rua, numero, bairro...

Rua,

numero, bairro,... Colunas da tabela cliente

<class name="br.org.citi.pec.locadora.Cliente" table="Clientes"> <component name=endereco class=br.org.citi.pec.locadora.Endereco> <property name=rua column=rua/> <property name=numero column=numero/> </component> </class>

Modelagem OO
Hibernate tambm d suporte a tipos de dados definidos pelo usurio n Interceptadores e EventListeners n Filtros n Definies explicitas dos SQLs de insert e update e load (hibernate 3)
n

...e mais um pouco!

Sobre configurao
n

Como obter um SessionFactory?


Programaticamente Por

arquivo XML

Configurao programtica
Configuration cfg = new Configuration() .setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect" ). .setProperty("hibernate.connection.driver_class", "org.hsqldb.jdbcDriver") .setProperty("hibernate.connection.url", "jdbc:hsqldb:file:hsqldb/data") .setProperty("hibernate.connection.username", "sa") .setProperty("hibernate.connection.password", "") .addClass(Filme.class) .addClass(Cliente.class) .addClass(Locacao.class); SessionFactory sessionFactory = cfg.buildSessionFactory();

Configurao XML
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate- configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" > <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class"> org.gjt.mm.mysql.Driver</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">ftBBvEdiC</property> <property name="hibernate.connection.url"> jdbc:mysql://localhost/lockar</property> <mapping class="br.org.citi.pec.locadora.Filme"/> <mapping class="br.org.citi.pec.locadora.Locacao"/> <mapping class="br.org.citi.pec.locadora.Cliente"/> </session-factory> </hibernate-configuration>

Configuration cfg = new Configuration().configure(); SessionFactory sessionFactory = cfg.buildSessionFactory();

Extras
n

Hbm2ddl (tool)
Gera

o schema do BD a partir das XML de mapeamentos Usado por linha de comando ou pelo ant
<target name="schemaexport"> <taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="project.lib.classpath" /> <schemaexport properties="hibernate.properties" quiet="yes" text="yes" drop="no" delimiter=";" output="${basedir}/sql/schema-export.sql"> <fileset dir="src"> <include name="**/*.hbm.xml" /> </fileset> </schemaexport> </target>

Exerccios
n

Ampliar nosso modelo

Exerccios
n n n

Crie as classes (JavaBeans/POJO) Crie os XML de mapeamentos Implemente as consultas e mtodos para retornar

Todos os filmes locados durante um determinado ms Listagem contendo nome do filme, mdia das avaliaes, e total de comentrios para todos os filmes Listagem contendo nome do filme mais o nmero de cpias de VHS e de DVD desse filme Listagem contendo nome do filme mais o nmero de cpias de VHS e de DVD desse filme locadas em um determinado ms Todos os clientes que locaram mais de 5 VHS no ultimo ms (Com as devidas locaes carregadas)

HQL Features
n from n select n where n having n order

by and group by n Funes Agregadas

HQL from
n

from eg.Cat
Retorna

todas as instancias da classe gato um alias para o objeto gato

from eg.Cat as cat


Cria

from java.lang.object obj


Retorna

todos os objetos persistentes

HQL from
n

from Formula, Parameter


Resulta

em produto cartesiano ou um join

HQL select
n n
Retorna

select cat.mate from eg.Cat cat


companheiro do objeto gato

select cat.mate, cat.color from eg.Cat cat


Retorna

mltiplos objetos como um array de Object[]

HQL Funes Agregadas


avg(), sum(), min(), max() n count(*), count(distinct ) n In, between, is null n any, some, all, exists
n

HQL where
from eg.Cat as cat where cat.name='Fritz
Seleciona

os gatos com nome Fritz

from ex.Cat cat where cat.mate.name is not null


Seleciona

os gatos cujo o nome do companheiro no seja nulo

HQL where
n

from ex.Cat cat, Dog dog where upper(cat.mate.name) like TAB% and cat.friend.dog = dog
Suporta

operaes lgica

HQL order by and group by


n

from eg.Cat cat order by cat.name asc, cat.weight desc, cat.birthdate asc
Aceita

asc e desc

select cat.color, sum(cat.weight), count(cat) from ex.Cat cat group by cat.color


Agrupa

pela cor do gato

HQL having
n

select cat from ex.Cat cat join cat.kittens kitten group by cat having avg(kitten.weight) > 100 order by count(kitten) asc, sum(kitten.weight) desc

Integrao com outras ferramentas

Integrao com outras ferramentas


n

Eclipse
Hibernator

(http://hibernator.sourceforge.net/) Hibernate Synchronizer (http://hibernatesynch.sourceforge.net/) HiberClipse (http://hiberclipse.sourceforge.net)


n

IntelliJ IDEA
HibernateTools

(http://www.intellij.org/twiki/bin/view/Main/HibernateTo ols)

Quem est usando Hibernate

Quem est usando Hibernate


n n n n

Empresa
TeraMEDICA,

Milwaukee

Projeto
Sistema

de Gerenciamento de Imagens Digitais facilidade de uso, custo

Motivos para escolha de Hibernate


Performance,

Ambiente de Desenvolvimento e Produo


Eclipse,

Oracle9i

Quem est usando Hibernate


n n n n

Empresa
AT&T

Labs, Tampa, Florida Billing Plataform

Projeto
Global

Tempo necessrio para estudo


Seis

semanas DB2

Ambiente de Desenvolvimento e Produo


WebSphere v3.5.3,

Quem est usando Hibernate


n n n n

Empresa
Datacodex,

Australia

Projeto
DriveNow

- Sistema de Locao de Veculos

Tempo necessrio para estudo


Trs

semanas

Ambiente de Desenvolvimento e Produo Eclipse, Resin, MySQL

Outras alternativas para ORM em aplicaes Java

Outras alternativas para ORM


n

Open source
The
n

Castor Project Relational Bridge (OJB)

http://castor.exolab.org/ http://db.apache.org/ojb/

Object
n

Comerciais
Cocobase
n

http://www.thoughtinc.com/cber_index.html http://otn.oracle.com/products/ias/toplink/index.html

TopLink
n

Concluses

Concluses
O Hibernate vem sendo utilizado em projetos de grande porte n Framework maduro e bem documentado n Ganho de produtividade n Integrao com os principais SGBDs do mercado n Fcil Mudana de SGBD
n

Crticas
n n n n n

Requer tempo de aprendizado, principalmente para os detalhes de funcionamento Possui uma linguagem prpria de consulta Verso 1.X no compatvel com a verso 2.X No suporta banco de dados ObjetosRelacionais e Orientado a Objetos Nos primeiros acessos 10% mais lento que JDBC

Vous aimerez peut-être aussi