Montar o objeto

Pessoal

tenho um dataTable e nele quando cliko em um botao alterar, ele vai para a pagina de cadastrado com os text ja preenchidos
minha duvida é.

tenho um relacionamento

Classe Pessoa:

	@OneToMany (mappedBy="pessoa")
	@Cascade (org.hibernate.annotations.CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.TRUE)
	private Set<RacaoCachorro> racaoCachorro;

Classe RacaoCachorro:

	@ManyToOne
	@JoinColumn (name="ID_PESSOA", nullable = false)
	private Pessoa pessoa;

Eu consigo cadastrar blz…
Agora quando mando alterar

meu objeto pessoa, a instancia racaoCachorro vem nula…
ou seja, nao carrega dados da racaoCachorro.
como faço pra trazer os dados da lista tb ?

no meu debug

o objeto pessoa
vem assim

   pessoa
       - id populado
       - nome populado
       - info populado
       - racaoCachorro null
             - id null 
             - nomeRacao null
	private Collection<RacaoCachorro> racaoCachorro;

Você deve mudar o Set para Cllection como mostrado. Em seguida posta o resultado.

nao deu certo
quando eu cliko na lista no debug ele gera isso

failed to lazily initialize a collection of role: br.com.ambiente.model.dto.Pessoa.racaoCachorro, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.ambiente.model.dto.Pessoa.racaoCachorro, no session or session was closed
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
	at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:483)
	at br.com.ambiente.view.bean.TesteBean.editRegistro(TesteBean.java:106)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:152)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:387)
	at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55)
	at org.ajax4jsf.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:1383)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119)
	at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

na mesma classe Pessoa tem

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) @JoinColumn(name="ID_CACHORRO_PESSOA") private CachorroPessoa cachorroPessoa = new CachorroPessoa();

Esse objeto cachorroPessoa vem populado normalmente
agora quando é uma Lista como acima… ela nao vem populada…

Tira essa anotação:
@LazyCollection(LazyCollectionOption.TRUE)

Daqui a pouco eu te mostro como eu faço o relacionamentos 1 pra muitos, mas acredito que agora funcione.

@OneToMany (mappedBy="pessoa") @Cascade (org.hibernate.annotations.CascadeType.ALL) private Set<RacaoCachorro> racaoCachorro;

deu certo

Agora como eu faço para pegar os valores da Lista e setar no meu objeto ?


Classe Pessoa

	@OneToMany (mappedBy="pessoa",fetch= FetchType.LAZY)  
	@Cascade (org.hibernate.annotations.CascadeType.ALL)
	private Set<RacaoCachorro> racaoCachorro;

Classe Racao

	@ManyToOne(fetch=FetchType.LAZY )
	@JoinColumn (name="ID_PESSOA", nullable = false)
	private Pessoa pessoa;

Agora para setar o Objeto para trazer os dados, fiz de um jeito que presto, mais creio que nao seja o correto

setRacaoCachorroPOJO(pessoaPOJO.getRacaoCachorro().iterator().next());

Agora meu objeto racaoCachorroPOJO vem todo populado com os dados da lista
seria assim ?

Isso ta errado, vc tem que popular da seguinte forma:

for(Iterator i; racaoCachoro.iterator(); i.next()){ RacaoCachoro r = (RacaoCachorro) i.hasNext(); racaoCachorro2.getTipoRacao("O tipo da racao"); . . . }

É +/- isso eu fiz de cabeça.

Agora na hora de exibir em um dataTable vc vai ter que mudar o Set para um Collection, List ou DataModel pq dataTable não funciona com Set.

Espero que resolva, mais uma vez posta ai seu resultado.

Cara olha só

minha Lista que vai pro dataTable ta vindo certim…
ela vem toda puplada inclusive o Set.

metodo da lista

public List<Pessoa> buscarAllPessoas(Pessoa pessoaPojo) {
        
    	 DetachedCriteria criteria = DetachedCriteria.forClass(Pessoa.class).setFetchMode("cachorroPessoa", FetchMode.JOIN);
    	 criteria.setFetchMode("racaoCachorro", FetchMode.JOIN);
    	
    	 List<Pessoa> lista = new ArrayList<Pessoa>();
			
    	 lista = getHibernateTemplate().findByCriteria(criteria);
			
	 return lista;
    	 
    }

Isso traz a lista toda certa,
agora la na minha dataTable no JSF
no campo que representa a lista como ficaria?

<h:outputText value="Ração" styleClass="label"></h:outputText>
<h:inputText size="25" value="#{pessoaBean.pessoaPojo.racaoCachorro.nomeRacao}" />

nesse caso é acessado a pessoa, depois a lista(set), depois o nomeRacao,
mas claramente isso nao funciona.
como eu jogo o valor da lista no text?

Como vc vai exibir uma Lista, uma coleção ou um DataModel vc deve usar um rich:subDataTable/ ou um <ui:repeat />. Eu utilizei nos meus um <ui:repeat /> ficando assim:

<rich:column> <f:facet name="header">Rua</f:facet> <!-- EXEMPLO UTILIZADO PARA COLLECTIONS --> <ui:repeat value="#{usuario.endereco}" var="end"> <h:outputText value="#{end.rua}" /> </ui:repeat> </rich:column>

Lembrando que usuario é a variavel definida no var=“usuario” do datatable.