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:
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:
Na sequência faço um ajuste no código anterior, habilitando a busca do Cliente junto com os Itens.
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
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 Setitens = 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