Bom dia pessoal,gostaria de saber qual a melhor estrategia para carregar uma classe que possui associação com mais de uma coleção utilizando o hibernate,já que por default ele só consegue carregar uma coleção. Antecipadamente muito obrigado
"já que por default ele só consegue carregar uma coleção"
Creio que essa informação não tenha fundamento.
O hibernate carrega as coleções que você quiser, basta configurar o atributo lazy de cada coleção com o valor false. lazy=“false”. Isso indica ao hibernete que vc deseja que o atrubuto seja sempre carregado antecipadamente, ou seja, no momento que a classe que possui as coleções é carregara.
Boa Sorte.
Estou utilizando hibernte annotations e spring , se vc tentar usar FetchType.EAGER mais de uma vez vai receber a seguinte execeção:
Eu não acho uma boa vc ter essas coisas eager, eu daria um jeito de deixar a sessão aberta e usar de forma lazy, mas, depende do seu negócio e da sua arquitetura, da uma olhada nesse link para ver se ajuda:
http://www.jroller.com/eyallupu/entry/hibernate_exception_simultaneously_fetch_multiple
[quote=“marciomarc”]Estou utilizando hibernte annotations e spring , se vc tentar usar FetchType.EAGER mais de uma vez vai receber a seguinte execeção:
Marcio,
Realmente não permite carregar múltiplas coleções do tipo List, mas se vc trocar estas coleções para Set vai permitir vc carregar mais do que uma tranquilamente.
Entretanto, também não recomendo vc usar essa estratégia, pois vc pode ter sérios problemas de performance, tanto é que por default o padrão é LAZY.
Recomendo vc fazer como o luBs orientou.
Outra forma de vc fazer sem deixar a sessão aberta é mudar a estratégia de recuperação de dados em tempo de execução.
Exemplo:
List<Usuario> usuarios = findContatoByExample(usuario, new String[] { EnumUsuario.PERMISSOES } );
public List<Usuario> findUsuarioByExample(Usuario usuario, String[] colecoes) {
final EntityManager em = getEntityManager();
Session hibernateSession = (Session)em.getDelegate();
Criteria criteria = hibernateSession.createCriteria(Usuario.class);
criteria.add(Example.create(usuario).enableLike(MatchMode.ANYWHERE));
if(colecoes != null) {
for(String col: colecoes) {
criteria.setFetchMode(col.getDescricao(), FetchMode.JOIN);
}
}
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Usuario> l = criteria.list();
hibernateSession.close();
return l;
}
@braços,