JSF + Hibernate Problema

4 respostas
bruno_savi

Pessoal Preciso de uma ajuda urgente...

estou tomando pau do JSF com o Hibernate estava tudo funcionando normal até eu criar um novo metodo...

segue abaixo o codigo....

ERRO
javax.servlet.ServletException: failed to lazily initialize a collection of role: br.com.comax.bean.cliente.ClienteBean.clientesContatoBean, no session or session was closed
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

root cause

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.comax.bean.cliente.ClienteBean.clientesContatoBean, no session or session was closed
	org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
	org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
	org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
	org.hibernate.collection.PersistentBag.size(PersistentBag.java:225)
	javax.faces.model.ListDataModel.isRowAvailable(ListDataModel.java:99)
	javax.faces.model.ListDataModel.setRowIndex(ListDataModel.java:174)
	javax.faces.model.ListDataModel.setWrappedData(ListDataModel.java:209)
	javax.faces.model.ListDataModel.<init>(ListDataModel.java:68)
	javax.faces.component.UIData.getDataModel(UIData.java:1069)
	javax.faces.component.UIData.setRowIndex(UIData.java:417)
	com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:85)
	javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:788)
	javax.faces.component.UIData.encodeBegin(UIData.java:879)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:884)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:245)
	com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176)
	org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
METODO DAO
public ClienteBean findByCPF(ClienteBean clienteBean) {

		Session session = HibernateFactory.getInstance().openSession();
		Transaction tx = session.beginTransaction();
		Criteria criteria = session.createCriteria(ClienteBean.class);
		criteria.add(Expression.eq("cpf", clienteBean.getCpf()));
		ClienteBean resultado = (ClienteBean) criteria.uniqueResult();
		tx.commit();
		session.close();
		return resultado;
	}
ClienteBean
@OneToMany(mappedBy = "clienteBean", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<ClientesContatoBean> clientesContatoBean = new ArrayList<ClientesContatoBean>();
ClientesContatoBean
@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "cliente_id", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
	private ClienteBean clienteBean;

4 Respostas

Lucas_Lacerda_Gertel

Boa tarde…
Para chamar um relacionamento 1-n você precisa estipular o FetchType.Eager.
Caso você tenha um FetchType.Lazy, você deve executar uma nova chamada antes de tentar o acesso dos objetos n.

Abraços.

bruno_savi

entendi e não entendi…
eu ja achei o erro com o que vc disse mas não sei como solucionar vc poderia me dar um exemplo…

Meu erro é ao fazer isso

cliente.getClientesContatoBean();
	 cliente.getClienteTaxaDeValoresBean();

como conseguiria fazer o certo com lazy?

Lucas_Lacerda_Gertel
@OneToMany(mappedBy = "clienteBean", fetch = FetchType.EAGER)  
@Cascade(CascadeType.ALL)  
private Collection<ClientesContatoBean> clientesContatoBean = new ArrayList<ClientesContatoBean>();

ou no teu criteria você chama o método:

public Criteria setFetchMode(String associationPath,
                             FetchMode mode)
                      throws HibernateException
bruno_savi

olá resolvi o problema usando filtros…

Criado 7 de julho de 2008
Ultima resposta 11 de jul. de 2008
Respostas 4
Participantes 2