Lazy, como utilizar?

3 respostas
C

Ola pessoal. Seguindo algumas orientações anotei todos os relacinamentos das minhas entidades com LAZY. Quando tento persistir um aluno, que por sua vez, possui outros relacionamentos na qual não populei, é lançada uma exceção:

javax.servlet.ServletException: #{MBincluirAluno.persist}: java.lang.IllegalStateException: Transaction not active

javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)

org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)

org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)

org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)

org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)

Minha dúvidas:
Eu posso colocar LAZY em todos os relacionamentos?
se não, quando utilizar um e outro?
Tem alguma coisa a ver com a maneira de como abro e fecho meu EntityManager?

Obs.: Achei algumas respostas, mas se referiam à session do hibernate, não sei como implementar no JPA/Hibernate.

3 Respostas

zoren

Esse erro é pq vc não iniciou uma transação

no seu entityManager tenta o getTransaction().begin() ou algo assim e no fim da o commit dela

C

companheiro, na minha dao ta assim:

public boolean persist(Object object) {

		EntityManager em = this.getEmf().createEntityManager();
        
		em.getTransaction().begin();

		boolean resultado = true;
		try {
			em.persist(object);
			em.getTransaction().commit();

		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
			resultado = false;
		} finally {
			em.close();

		}
		return resultado;
	}
hvivox

Parceiro!

Há pouco tempo estava com msm problema! Recomendo que além das minhas dicas procure se aprofundar mas… pq esse resurso ajuda bastante porém vc tem que conhecer outros fatores que influenciam o funciomanto do mesmo

  1. vc só pode utilizar o lazy ex: funcionario.getFones(); se uma exção estiver aberta. caso contrario vai dar o erro mostrado por vc. Isso implica em muitas coisas, tipo vc vai ter que gerenciar suas sessões. Quando vc exibir todos os fones ai sim vc poderá fechar a sessão!

  2. Procure implementar sua classe de conexão do hibernate ou JPA, crie metodos para pegar a sessão aberta, comitar, rodback isso é importante.

  3. Quando vc for listar os telefones use algo como: for(Fone fone : getFones())

blz.

Criado 31 de janeiro de 2010
Ultima resposta 31 de jan. de 2010
Respostas 3
Participantes 3