Pular para o conteúdo principal

Fetch Profile nova funcionalidade do Hibernate 3.5

No final de Março foi lançado Hibernate 3.5, framework Mapeamento Objeto Relacional mais "badalado" do Java.

A grande expectativa dessa versão é justamente por a partir dela o Hibernate torna-se uma implementação da JPA 2.0. A JSR 317 especificou recursos já existentes no Hibernate com novas funcionalidades dando uma cara nova ao mecanismo padrão para ORM em aplicativos Java.

Mas além da compatibilidade a JPA 2.0, o Hibernate conta com algumas melhorias como o suporte a JDBC 4 (Java 6), junção dos projetos Hibernate Core, Hibernate Annotations, Hibernate EntityManager e Hibernate Envers. Fechando com novas funcionalidades como o Fetch Profile.

Via de regra, mapear as associações com fetchType usando Lazy não faz mal a ninguém, principalmente em relacionamentos que envolvem collection como @OneToMany e @ManyToMany. Uma solução comum para carregar mais de uma entidade em única busca no banco é utilizar join fetch via HQL, ou mesmo via Criteria.

A partir do Hibernate 3.5, com o Fetch Profile isso pode ser feito de uma forma diferente e bem simples. No mapeamento é necessário indicar a entidade, o relacionamento/atributo que deve ser carregado e por fim um nome para o Fetch Profile. Vou usar o clássico exemplo Pedido com um Cliente e vários Itens para demonstrar o uso, código está bem reduzido com foco em Fetch Profile:
@FetchProfiles(value={
    @FetchProfile(name="pedido-com-cliente",
        fetchOverrides=@FetchProfile.FetchOverride(
            entity=Pedido.class,
            association="cliente",
            mode=FetchMode.JOIN)
    ),

    @FetchProfile(name="pedido-com-itens",
        fetchOverrides=@FetchProfile.FetchOverride(
            entity=Pedido.class,
            association="itens",
            mode=FetchMode.JOIN)
    )
})

@Entity
public class Pedido {

    // mapeamento dos outros atributos foram omitidos ...
    
    @ManyToMany(fetch=FetchType.LAZY) //o default eh EAGER
    private Cliente cliente;

    @OneToMany(fetch=FetchType.LAZY)
    private Set itens = new HashSet();

    // getters, setters e outros metodos foram omitidos ...
}


Observação: caso exista só um @FetchProfile, não é necessário definir @FetchProfiles.

Agora é só habilitar o Fetch Profile na Session indicando pelo nome, através do método setFetchProfile. Uma vez que esse método é acionado, enquanto a Session for utilizada o Fetch Profile será respeitado.

A seguir trecho do codigo do PedidoDAO usando usando esse esquema:
//busca comum, nesse caso soh na tabela Pedido
Pedido p1 = (Pedido) session.get(Pedido.class, 4); //existe pedido com id 4

//habilita busca (get) do pedido com itens
session.enableFetchProfile("pedido-com-itens");

//gera sql para tabela Pedido com left outer join em ItemPedido
Pedido p2 = (Pedido) session.get(Pedido.class, 7); //existe pedido com id 7


Na sequência faço um ajuste no código anterior, habilitando a busca do Cliente junto com os Itens.
//habilita busca (get) do pedido com itens
session.enableFetchProfile("pedido-com-itens");

//gera sql para tabela Pedido com left outer join em ItemPedido
Pedido p2 = (Pedido) session.get(Pedido.class, 7); //existe pedido com id 7

//na mesma session, habilita busca (get) do pedido com cliente
session.enableFetchProfile("pedido-com-cliente");

//gera sql para tabela Pedido com left outer join com ItemPedido e Cliente
Pedido p2 = (Pedido) session.get(Pedido.class, 7); //existe pedido com id 7


Para desabilitar o Fetch Profile é só chamar o método disableFetchProfile da Session. Por enquanto o formato da busca é via JOIN, as outras opções devem sair junto com Hibernate 3.7.

Depois de quase 10 anos, o Hibernate começou a ser criado em 2001, é possível melhorar!


Mais informações:


[]'s
Eder Magalhães
www.yaw.com.br
twitter.com/youandwe
twitter.com/edermag

Comentários

Muito legal, aumenta a glanularidade da configuração de forma simples!

Postagens mais visitadas deste blog

10 reasons why we love JSF

1. One-slide technology: it's so simple that I can explain basic JSF with one slide. 2. Easy to extend: components, listeners, render kit, Events, Controller, etc. 3. Real-world adoption: JBoss, Exadel, Oracle, IBM, ... 4. Architecture model: you can choose between more than 100 different architecture. 5. Open-mind community: using JSF you are going to meet very interesting people. 6. We are using JSF the last 5 years and we found very good market for JSF in Brazil 7. Progress: look to JSf 1.1 to JSF 1.2, JSF 1.2 to JSF 2.0. People are working really hard! 8. Many professionals now available 9. It's a standard. It's JCP. Before complain, report and help! 10. Ed Burns, spec leader, is an old Globalcode community friend! EXTRA: My wife is specialist in JSF. She's my F1 for JSF :) Nice job JSF community! -Vinicius Senger

JSF 2 - Composite Components, você não precisa mais ser um ninja

Estamos em uma nova era da computação, os dados não estão mais localizados em um banco dentro de sua empresa, vivemos a explosão de redes sociais, informações são geradas a todo instante, e se torna essencial que sua aplicação conheça os serviços disponíveis na web e consumam suas APIs geralmente disponíveis por serviços REST. Legal, mas como ficam meus aplicativos Java EE neste novo cenário? Para quem vem acompanhando a evolução da plataforma, é notório que todo esforço vem sendo utilizado para aumentar a produtividade e a integração com novos serviços. Basicamente duas especificações surgem com muita força para atender este cenário, a JSR - 314 (JSF-2) e JSR - 311 (JAX-RS), neste post exploraremos a JSR-314 (JSF2) e sua nova forma de criar Composite Components. Uma das grandes queixas dos desenvolvedores JSF era a complexidade em criar composite components, era necessário um vasto conhecimento sobre o ciclo de vida de uma aplicação JSF. Agora, você não precisa ser mais um “ninja” em ...

D.B.C.D. - Desenvolvimento baseado na "Caverna do Dragão"

Depois de muito tempo sem assistir este épico desenho, acabei topando com ele novamente enquanto esperava minhas crianças acordarem (é sério mesmo!). Assisti por 60 segundos e logo peguei meu laptop pois acabava de ter o meu último insigth do ano: você já imaginou ensinar desenvolvimento de software para aqueles personagens? Teríamos uma equipe PERFEITA, pense bem: - Bob: o jovem valente com um tacape aparentemente podereso, mas poucas vezes ajuda efetivamente. É o programador Ruby on Rails. - Daiana: teríamos aquela jovem com bastão mágico que pode dar longos pulos. Casa perfeitamente com metodologias ágeis e Sprint. - Erick: o bundão com aquele escudo. É o cara da auditoria PMI com pós em CMM. Sabe tudo de logs é expert em TXT. - Sheila: a fulana que tem a capa que pode sumir. Bem, essa nem precisa de explicação. Muitos programadores sofrem de síndrome de Sheila. - Presto: é o mágico que em situações extremas tenta tirar algo do chapéu, mas nunca funciona. Basicamente é...

Devo fazer um curso ou ler um livro?

Acredito que todos os instrutores ou professores, independentemente da área, escola ou centro de treinamento, já devam ter recebido essa pergunta alguma vez na vida: devo fazer um curso ou ler um livro? Para responder a essa pergunta, precisamos avaliar os prós e contras de cada opção. Trabalho com treinamento há algum tempo e, hoje, recebi essa pergunta de um aluno. Não adianta responder a ou b sem argumentar, demonstrando as opções conforme a situação do aluno. O conteúdo, a forma de transmissão e a capacidade de assimilação do indivíduo são chaves para haver benefício maior de aprendizado. Tanto em um bom curso quanto em um bom livro, o conteúdo é a premissa básica . Por conteúdo entendemos: se está organizado; se respeita pré-requisitos; se promove o aprendizado guiado e incremental; se aborda de forma satisfatória os principais pontos; se tem bom balanço entre teoria, exemplos e prática (favorecendo exemplos e prática); se tem como premissa a acessibilidade possível (e cabível) pa...

Facelets uma forma mais ágil para construção de telas – Parte I

A construção de telas ou camada de apresentação em um sistema MVC seja web ou desktop é uma tarefa complexa e de extrema importância. Nesse post vou comentar e mostrar algum exemplo do Facelets como solução para os desafios existentes nessa etapa especificamente para web. Com a web cada vez mais presente em nosso dia-a-dia, um fato é que com isso nossos usuários tornam-se mais exigentes em relação a usabilidade, agilidade, performance ou de uma forma bem resumida “o usuário espera uma navegação simples e agradável aonde uma determinado tarefa possa ser concluída em poucos passos e em um curto espaço de tempo”. Atender as expectativas em relação ao que o usuário espera com o que realmente ele precisa, definir uma estrutura flexível a mudanças sem engessar o desenvolvimento, acessibilidade, portabilidade em múltiplos navegadores, tudo isso e muito mais, num prazo que quase sempre é apertado. Um outro ponto fundamental é manter o time motivado e produtivo em um ambiente que favoreça a...

Sistema interativo de TV Digital com Ginga-J

No início de 2009, os estudantes de Sistema de Informação do Centro Universitário de Votuporanga ( UNIFEV ), Caio César Pereira de Souza e Rodrigo Gonçalves Constantino me apresentaram uma proposta para que eu fosse co-orientador junto ao professor orientador Djalma Domingos da Silva , em seu Trabalho de conclusão de curso (TCC) com tema TV Digital. A base que motivou o assunto, foi a palestra apresentada por Maurício Leal na I Conferência Java Noroeste sobre o tema TV Digital, realizada em 2006 em Votuporanga-SP. Ficamos muito entusiasmados com a possibilidade de interatividade na TV Digital, e a grande quantidade de possibilidades de desenvolvimento de aplicativos nesta área. Acompanhamos de perto as notícias na imprensa e todo o esforço e iniciativas realizadas pelo Fórum do Sistema Brasileiro de TV Digital Terrestre (SBTVD) , que organizou e produziu especificações ABNT, normatizando o sistema de TV Digital Terrestre. O foco do TCC foi realizar o desenvolvimento de uma pequena ...