Hibernate Java avanado PCC Jobson Ronan jrjscin ufpe
Hibernate Java avançado – PCC Jobson Ronan {jrjs@cin. ufpe. br} Guilherme Kely {gkmo@cin. ufpe. br} Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
O que é? w Hibernate é uma moderna solução de mapeamento objeto-relacional(ORM) Persistência transparente (POJO/Java Beans) u “Lazy Fetching” u Uso de uma Cache u Três estratégias para o mapeamento de heranças u Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
O que é? Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Pra que transparência? w w Persistência sem impacto no código dos objetos de negócio Qualquer classe pode ser uma classe persistente sem ser necessário implementar nenhuma classe ou interface Classes persistentes podem ser usadas fora do contexto de persistência (ex Testes) Total portabilidade sem dependências Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Problemas dos BDRs w Modelagem Não há polimorfismo u Não há herança u w Lógica de negócio u Stored procedures -> perca de portabilidade Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Vantagens dos RDBs w Trabalhar com grandes quantidades de dados u w Trabalhar com conjuntos de dados u w Junções e agregações Compartilhamento u u w Busca, ordenação Concorrência (Transações) Muitas aplicações Integridade u u Restrições (Constraints) Isolação de transações Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
w Obviamente, ainda precisamos dos RDBs Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Objetivo w w Aproveitar-se das vantagens oferecidas pelos RDBs Isso sem perder a orientação a objetos Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Objetivo Real w w Ter menos trabalho Ter um DBA feliz Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Em prática w Locadora em partes. . . Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Em prática w Classe Persistente u u u Construtor default Pares de Get´s e Set´s Uma propriedade identificadora package br. org. citi. pec. locadora; public class Filme { private int codigo; private String nome; public int get. Codigo() { return codigo; } private void set. Codigo(int codigo) { this. codigo = codigo; } public String get. Nome() { return nome; } private void set. Nome(int nome) { this. nome = nome; } } Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Em prática w Mapeamento XML Metadado legível u Mapeamento de tabelas e colunas u <? xml version="1. 0" encoding="UTF-8"? > <!DOCTYPE hibernate-mapping PUBLIC "-//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> Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Em prática w Salvando um objeto Session session = session. Factory. open. Session(); Transaction tx = session. begin. Transaction(); Filme filme = new Filme(); filme. set. Nome(novo. Nome); session. save(filme); tx. commit(); session. close(); Também pode ser usado save. Or. Update Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Em prática w Carregando um objeto Session session = session. Factory. open. Session(); Filme filme = (Filme) session. load(Filme. class, new Integer(filme. Id); session. close(); w w Não use load para determinar se um objeto existe (uma exceção é lançada neste caso) Use get. Este retorna null caso o objeto não exista Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Em prática w Removendo um objeto Session session = session. Factory. open. Session(); Transaction tx = s. begin. Transaction(); Filme filme = (Filme) session. get(Filme. class, new Integer(filme. Id); session. delete(filme); tx. commit(); session. close(); Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Em prática w Atualizando um objeto (Dirty Checking) u Obetendo um filme e alterando seu nome Session session = session. Factory. open. Session(); Transaction tx = s. begin. Transaction(); Filme filme = (Filme) session. get(Filme. class, new Integer(filme. Id); filme. set. Nome(novo. Nome); tx. commit(); session. close(); Não é necessário uma chamada explicita do update Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Estado dos Objetos w Alguns conceitos sobre objetos u Transiente. • Nunca persistido. Não associado a nenhuma sessão (Session) u Persistente • Associado a uma única sessão u Desacoplado (Detached) • Já persistido, mas não associado a nenhuma sessão Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Estado dos Objetos w Dirty Checking só funciona em objetos persistentes u Use update para objetos desacoplados Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Mais prática w Melhorando nosso modelo. . . Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Mais prática w 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(); //. . . Get´s e Set´s } Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Mais prática w Classes persistentes package br. org. citi. pec. locadora; public class Locacao { private int id; private Filme filme; private Cliente cliente; private Date data. Locacao; private Date datadevolucao; //. . . Get´s e Set´s } Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Mais prática w XML. . . <? xml version="1. 0" encoding="UTF-8"? > <!DOCTYPE hibernate-mapping PUBLIC "-//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> Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Mais prática w XML. . . <? xml version="1. 0" encoding="UTF-8"? > <!DOCTYPE hibernate-mapping PUBLIC "-//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="data. Locacao" /> <property name="data. Devolucao" /> Baixar <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> versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Mais prática w Persistência transitiva Locacao locacao = new Locacao(); Locacao. set. Data. Locacao(new Date()); Session session = session. Factory. open. Session(); Transaction tx = s. begin. Transaction(); Filme filme = (Filme) session. get(Filme. class, new Integer(filme. Id); Cliente cliente = (Cliente) session. get(Cliente. class, login); locacao. set. Cliente(cliente); locacao. set. Filme(filme); cliente. get. Locacoes(). add(locacao); tx. commit(); session. close(); Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Herança w Estratégias para o mapeamento de herança Uma tabela por hierarquia de classes u Uma tabela por subclasse u Uma tabela por classe concreta u Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Herança w Uma tabela por subclasse <? xml version="1. 0" encoding="UTF-8"? > <!DOCTYPE hibernate-mapping PUBLIC "-//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. Cliente. Especial" table="Clientes. Especiais"> <key column="LOGIN" /> <property. . . />. . . </joined-subclass> </hibernate-mapping> Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Otimizando w Como as coleções são carregadas Lazy fetching (Default) u Eager (Outer Join) fetching u • Indicado nos XML, ou na própria consulta Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Lazy fetching w SQL escondido: Cliente cliente = (Cliente) session. get(Cliente. class, login); SELECT … FROM CLIENTES C WHERE C. LOGIN = ? Iterator cliente = cliente. get. Locacoes(). iterate(); SELECT … FROM LOCACOES L WHERE L. LOGIN_CLIENTE = ? Filme filme = locacao. get. Filme(); SELECT … FROM FILMES F WHERE F. FILME_ID = ? Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Outer join fetching w 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 = ? Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Otimizando w Como otimizar? Minimizando a leitura de linhas das tabelas u Minimizando a quantidade de comandos SQLs enviados u Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Otimizando w Minimizando a leitura de linhas das tabelas u w Usar lazy fecthing Minimizando a quantidade de comandos SQLs enviados u Usar outer join fetching Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Otimizando w Problemas u Usar lazy fecthing • Problema dos n+1 selects (muitos selects!) u Usar outer join fetching • Problema do produto cartesiano (grandes conjuntos de dados) Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Otimizando w Solucionando problemas de otimização Stratégia de Fecthing definida em tempo de execução u Batch Fecthing u Utilizar um cache de segundo nível u Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Consultas w HIbernate Query Lanuage u w Permite que se expresse quase tudo o que se precisa expressar em SQL, porém mais orientado a objetos Três maneiras de se fazer consultas no Hibernate HQL u Criteria u SQL nativo u Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w w Tornar SQL orientado a objetos u Classes e propriedades ao invés de Tabelas e colunas u Polimorfismo u Associações Total suporte a operações relacionais u Joins u Projeções u Funções agregadas e agrupamento u Ordenação u Sub. Queries u Chamadas a funções SQL Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL A consulta mais simples possivel HQL w from Filme u Devolva todos os filmes List filmes = session. create. Query(“from Filme”). list(); w As consultas podem ser paginadas Query query = session. create. Query(“from Filme”); query. set. First. Result(20); query. set. Max. Results(30); List filmes = query. list(); Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w Uma consulta com ordenação from Locacao l order by l. data. Locacao desc w Caso esteja interessado em um único resultado Query query = session. create. Query( “from Locacao l order by l. data. Locacao desc”); Locacao locacao = query. unique. Result(); Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w Uma consulta com joins select c from Cliente c left join [fetch] c. locacaoes l where l. data. Locacao > 3/5/2005 u w Todos os clientes com suas locações efetuadas após o dia 3 Definição da estratégia de fetching u u Com o fetch: Coleções já inicializadas Sem o fetch: lazy collections Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w HQL suporta os mesmos operadores que SQL w Operadores do HQL: u Comparação: =, <>, <, >, >=, <=, between, not between, in, not in u Nulidade: is null, is not null u Aritméticos: +, -, /, *, %, parênteses w O operador like funciona da mesma forma que SQL w Pode usar funções SQL se o banco suportar Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w Projeções + funções agregadas (Report Queries) select c. nome, count(l) from Cliente c, c. locacoes l where l. data. Locacao between(: inicio, : fim) group by c. nome order by count(l) Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w Os dados da consulta anterior serão retornados em List de Object[] Consulta comum para a realização de relatórios w Podemos tornar o processo mais elegante w List list = session. create. Query( “select new Cliente. Report. Row(c. nome, count(l)) ” + “from Cliente c, c. locacoes l ” + “where l. data. Locacao between(: inicio, : fim) ” + “group by c. nome ” + “order by count(l)”). set. Date(“inicion”, inicio). set. Date(“fim”, fim). list(); Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w w Dessa forma evitas-se o uso de vetores de objetos É necessário que exista uma classe e um construtor previamente definido Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
HQL w Consultas não precisam aparecer no código u u w Na verdade, muitas vezes é melhor que não apareçam Podem ficar nos metadados e serem chamadas pelo nome Usa-se o método get. Named. Query() List clientes = session. get. Named. Query(“find. Cliente. By. Name”). set. String(“nome”, nome), list() w Mas antes, ela precisa ser declarada em algum arquivo de mapeamento <query name=“find. Cliente. By. Name”><![CDATA[ from Cliente c where c. nome like : nome]] </query> Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Modelagem OO w “Mais classes que tabelas” u Classse Endereco • Propriedade: rua, numero, bairro. . . u 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> Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
O que mais? w w Hibernate também dá suporte a tipos de dados definidos pelo usuário Interceptadores e Event. Listeners Filtros Definições explicitas dos SQLs de insert e update e load (hibernate 3). . . e mais um pouco! Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Sobre configuração w Como obter um Session. Factory? Programaticamente u Por arquivo XML u Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Configuração programática Configuration cfg = new Configuration(). set. Property("hibernate. dialect", "org. hibernate. dialect. HSQLDialect"). . set. Property("hibernate. connection. driver_class", "org. hsqldb. jdbc. Driver"). set. Property("hibernate. connection. url", "jdbc: hsqldb: file: hsqldb/data"). set. Property("hibernate. connection. username", "sa"). set. Property("hibernate. connection. password", ""). add. Class(Filme. class). add. Class(Cliente. class). add. Class(Locacao. class); Session. Factory session. Factory = cfg. build. Session. Factory(); Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Configuração XML hibernate. cfg. xml <? xml version="1. 0" encoding="UTF-8"? > <!DOCTYPE hibernate-configuration PUBLIC "-//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. My. SQLDialect</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">ft. BBv. Edi. C</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(); Session. Factory session. Factory = cfg. build. Session. Factory(); Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Extras w Hbm 2 ddl (tool) Gera o schema do BD a partir das XML de mapeamentos u Usado por linha de comando ou pelo ant u <target name="schemaexport"> <taskdef name="schemaexport" classname="org. hibernate. tool. hbm 2 ddl. Schema. Export. Task" 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> Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Exercícios w Ampliar nosso modelo Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Exercícios w Crie as classes (Java. Beans/POJO) w Crie os XML de mapeamentos w Implemente as consultas u Todos os filmes locados durante um determinado mês u Listagem contendo nome do filme, média das avaliações, e total de comentários para todos os filmes u Listagem contendo nome do filme mais o número de cópias de VHS e de DVD desse filme u u Listagem contendo nome do filme mais o número de cópias de VHS e de DVD desse filme locadas em um determinado mês Todos os clientes que locaram mais de 5 VHS no ultimo mês (Com as devidas locações carregadas) Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
Exercício 2 w Re-implemetar as classes de repositório do projeto usando o hibernate Baixar versão 3. 0. 5 do hibernate em http: //www. hibernate. org/
- Slides: 52