Hibernate gerando consulta sem eu fazer O.o

7 respostas
evertonsilvagomesjav

Pessoal quando eu acesso minha lista dessa forma no codigo:

if(cliente.getListAcompanhantes() == null || cliente.getListAcompanhantes().size() == 0){ cliente.setListAcompanhantes(new ArrayList<Acompanhante>()); }

o objeto ate entao tava com a lista null, ai quando ele entra no if ele gera uma consulta e traz todos os acompanhantes que estao no BD, por que isso? :shock:

Isso era pra dar um lazyInitializationException nao?

O mapeamento esta assim:

@LazyCollection(value=LazyCollectionOption.TRUE) @OneToMany(cascade=CascadeType.ALL, mappedBy="cliente", fetch=FetchType.LAZY) private List<Acompanhante> listAcompanhantes;

7 Respostas

Hebert_Coelho

Se a conexão estiver aberta não vai dar esse erro.

evertonsilvagomesjav

Eu uso uma instancia so do EntityManager, mas pq ta fazendo a consulta tem ideia?

lele_vader

Quando você chama getListAcompanhantes() ele traz a lista que é lazy.

Mostra o resto do código lá para ver se você fechou a conexão antes e daí não casou lazy initialization exception.

Rodrigo_Sasaki

Você está utilizando EJBs? Por acaso ele seria Stateful ?

Hebert_Coelho

Eu uso uma instancia so do EntityManager, mas pq ta fazendo a consulta tem ideia?Tome cuidado na hora de começar usar um framework sem antes entende-lo.
Você precisa entender que o lazy irá ser carregado toda vez que você chamá-lo. Se ñ tiver conexão ativa uma mensagem de erro será exibida, mas caso exista uma conexão ativa a consulta será feita. Esse é o comportamento do LAZY.
Oq tem haver usar ou ñ instancia do EntityManager, ñ entendi… :S

evertonsilvagomesjav

Eu uso uma instancia so do EntityManager, mas pq ta fazendo a consulta tem ideia?Tome cuidado na hora de começar usar um framework sem antes entende-lo.
Você precisa entender que o lazy irá ser carregado toda vez que você chamá-lo. Se ñ tiver conexão ativa uma mensagem de erro será exibida, mas caso exista uma conexão ativa a consulta será feita. Esse é o comportamento do LAZY.
Oq tem haver usar ou ñ instancia do EntityManager, ñ entendi… :S

Falei que uso uma instancia do entityManager, sendo assim tenho uma conexao pra aplicação inteira. Teria como vc me ajudar? Veja como busco o entityManager e como estou usando.

Uso um DAO generico e nele eu tenho meu EntityManager dessa forma:

public static GenericDaoBeanAgenciaTurismo getInstance(){ if(dao == null){ return dao = new GenericDaoBeanAgenciaTurismo(HibernateUtils.getEntityManager()); }else{ return dao; } }

Aqui vem o EntityManager

public static EntityManager getEntityManager(){ if(em == null){ EntityManagerFactory emf = Persistence.createEntityManagerFactory("AgenciaTurismoEntityManager"); em = emf.createEntityManager(); } return em; }

Então eu nao fecho a conexão hora nenhuma, os métodos utilizados no DAO estão assim por exemplo:

public <T> List<T> consultaTodos(Class<T> type) { List<T> list = null; Query query = getEntityManager().createQuery( "Select a from " + type.getName() +" a"); list = query.getResultList(); return list; }

A unica coisa e que nos inserts eu abre e fecho a transaçao.

Deu pra entender?

evertonsilvagomesjav

lele_vader:
Quando você chama getListAcompanhantes() ele traz a lista que é lazy.

Mostra o resto do código lá para ver se você fechou a conexão antes e daí não casou lazy initialization exception.

Eu teria que fechar a conexão quando? Pois nao estou fechando hora nenhuma…

O ideal seria que a cada transação com o banco eu fechar? entityManager.close()?

Fiz assim e funcionou da forma q eu queria, so nao sei se e o mais correto, todas as vezes q utilizo o BD com o entityManager no final to fechando dando um entityManager.close() daí todas as vezes que vou utilizar de novo eu crio um novo entityManager assim:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("AgenciaTurismoEntityManager"); em = emf.createEntityManager();

Criado 5 de junho de 2012
Ultima resposta 6 de jun. de 2012
Respostas 7
Participantes 4