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 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