Académique Documents
Professionnel Documents
Culture Documents
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
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
Modelagem
No
h polimorfismo No h herana
n
Lgica de negcio
Stored
ordenao e agregaes
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
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
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
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
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; } ...
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>
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"/>
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
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
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();
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);
Exemplo Locadora
n
Persistente
n
Desacoplado
n
(Detached)
Exemplo Locadora
n
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
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 = ?
SQL escondido:
WHERE C.LOGIN = ?
Herana
n
tabela por hierarquia de classes Uma tabela por subclasse Uma tabela por classe concreta
Herana
n
Otimizando
n
Como otimizar?
Minimizando
Otimizando
n
lazy fecthing
Otimizando
n
Problemas
Usar
n
lazy fecthing
Usar
n
Otimizando
n
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
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();
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
session.update(usuario);
t.commit(); session.flush(); session.close();
Removendo um objeto
n
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();
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();
Consultas
n
que se expresse quase tudo o que se precisa expressar em SQL, porm mais orientado a objetos
nativo
HQL
n
Classes e propriedades ao invs de Tabelas e colunas Polimorfismo Associaes Joins Projees Funes agregadas e agrupamento Ordenao SubQueries Chamadas a funes SQL
HQL
n
n As consultas podem ser paginadas Query query = session.createQuery(from Filme); query.setFirstResult(20); query.setMaxResults(30); List filmes = query.list();
HQL
n
Query query = session.createQuery( from Locacao l order by l.dataLocacao desc); Locacao locacao = query.uniqueResult();
HQL
n
HQL
n n
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
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
Na verdade, muitas vezes melhor que no apaream Podem ficar nos metadados e serem chamadas pelo nome
Modelagem OO
n
Endereco
Rua,
<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
Sobre configurao
n
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>
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
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
HQL from
n
from eg.Cat
Retorna
HQL from
n
HQL select
n n
Retorna
HQL where
from eg.Cat as cat where cat.name='Fritz
Seleciona
HQL where
n
from ex.Cat cat, Dog dog where upper(cat.mate.name) like TAB% and cat.friend.dog = dog
Suporta
operaes lgica
from eg.Cat cat order by cat.name asc, cat.weight desc, cat.birthdate asc
Aceita
asc e desc
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
Eclipse
Hibernator
IntelliJ IDEA
HibernateTools
(http://www.intellij.org/twiki/bin/view/Main/HibernateTo ols)
Empresa
TeraMEDICA,
Milwaukee
Projeto
Sistema
Oracle9i
Empresa
AT&T
Projeto
Global
semanas DB2
Empresa
Datacodex,
Australia
Projeto
DriveNow
semanas
Open source
The
n
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