Problema com lista no Velocity

Olá pessoal, bom estou com o seguinte problema:

  • Tenho duas classes:

    Classe X que possui uma lista de Y

Bom, até aí tudo bem, os mapeamentos no hibernate estão corretos, o insert funciona normalmente.

O problema ocorre qdo desejo visualizar os registros desta lista na página de consulta.

Essa página funciona da seguinte maneira, faço uma consulta de X, essa pesquisa me retorna um List de X, que por sua vez possui uma lista de Y.

Faço um #foreach para X que imprime corretamente os dados na página e para cada iteração de X tenho um outro #foreach que itera sobre a lista de Y caso X a possua, porém nada é impresso dessa lista de Y.

Gostaria de saber se alguém já passou por isso e como resolveu.
Não sei se estou esquecendo de algo, mas a principio a lista de Y dentro de X vem preenchida.

Espero ter sido claro.

Você está tentando fazer isto

#foreach( $y in $list )
    <p>$y.id</p>
#end

ou

#foreach( $y in $list )
    #foreach( $o in $y )
        <p>$o.id</p>
    #end
#end

?

De qualquer maneira, duas coisas:

  1. Verifique se a lista está realmente preenchida
  2. Verifique se a query do Hibernate que você fez é a do tipo que retorna um Object[] (contendo as colunas) ou um objeto da classe X mesmo.

Poste o código no velocity, a consulta que está fazendo no Hibernate e os pedaços interessantes das classes X e Y se puder :smiley:

E ae LIPE, tranquilo…

Seguinte, estou sem meus fontes no momento, mas estou tentando fazer algo assim:

#foreach( $o in $list )
    <p>$o.id</p>
    #foreach( $y in $o.getListY() )
        <p>$y.id</p>
    #end
#end

Entendi. Ele imprime os ids de O normal, certo?

#foreach( $o in $list )
    <p>$o.id</p>
    #foreach( $y in $o.listY() )
        <p>$y.id</p>
    #end
#end

Bem, o código está normal. Numa aplicação aqui faço exatamente isso em diversas partes do sistema.

Se a listY de O está declarada como lazy, lembre-se que tem que manter a session aberta até terminar de renderizar a view. Isto está acontecendo? Alguma exceção é lançada?

Já tentou apenas imprimir o tamanho da $o.listY?

hmmm…

Lembro de não ter setado para Lazy no mapeamento, talvez esse seja o motivo, até porque nenhuma exceção é lançada. O que acha?

Bem, se nenhuma exceção é lançada, você tem certeza absoluta que não há nenhum erro de digitação e você não colocou a core do texto igual a do fundo, ou as listas todas estão vazias ou eu enlouqueci hehe :smiley:

farei os testes em casa… Espero obter um retorno deles, senão terei que bancar a conta do hospício pelo jeito… :smiley:

E ae LIPE…

Seguinte, aqui estão os mapeamentos:

[code]
<hibernate-mapping>

&lt;class name="br.com.digitins.bean.Conta" table="CONTA" lazy="true"&gt;

    &lt;id name="codConta" type="integer"&gt;
        &lt;column name="CODCONTA"/&gt;
        &lt;generator class="identity"/&gt;
    &lt;/id&gt;

    &lt;timestamp name="dataCompra" column="DATA_COMPRA"/&gt;
    &lt;property name="descricao" column="DESCRICAO"/&gt;
    &lt;property name="parcelado" column="PARCELADO"/&gt;
    &lt;property name="quantidadeParcela" column="QUANTIDADE_PARCELA"/&gt;
    &lt;property name="valorTotal" column="VALOR_TOTAL"/&gt;
    &lt;property name="juro" column="JURO"/&gt;
	&lt;bag name="parcelas" table="PARCELA" inverse="true" cascade="all-delete-orphan"&gt;
		&lt;key column="CODPARCELA"/&gt;
		&lt;one-to-many class="br.com.digitins.bean.Parcela"/&gt;
	&lt;/bag&gt;
	
&lt;/class&gt;

</hibernate-mapping>[/code]

[code]
<hibernate-mapping>

&lt;class name="br.com.digitins.bean.Parcela" table="PARCELA" lazy="true"&gt;

    &lt;id name="codParcela"&gt;
        &lt;column name="CODPARCELA"/&gt;
        &lt;generator class="identity"/&gt;
    &lt;/id&gt;

    &lt;property name="valor" column="VALOR"/&gt;
    &lt;property name="dataVencimento" type="java.util.Date" column="DATA_VENCIMENTO"/&gt;
	&lt;many-to-one name="conta" class="br.com.digitins.bean.Conta" column="CODCONTA" not-null="true"/&gt;
&lt;/class&gt;

</hibernate-mapping>[/code]

#foreach( $conta in $contas )
  #foreach( $parcela in $conta.getParcelas() )
     $parcela.getDataVencimento()&lt;/td&gt;
     $parcela.getValor()&lt;/td&gt;
  #end
#end 

continuo tendo problema. :frowning:

Bom, fiz alguns testes e percebi o seguinte:

Eu possuo uma conta com 4 parcelas porém quando retorno da pesquisa de contas, essa conta retorno com apenas um registro na lista de parcelas ao invés de 4.

Opa cara, nem vi seu tópico (aparentemente a marcação de tópicos não lidos ainda não está ok).

Bem, vejamos:
No relacionamento one-to-many a propriedade KEY deve indicar a coluna (na tabela do lado muitos) que é a foreign key. Tem certeza que isto está certo? Provavelmente esta é a razão de estar retornando apenas um registro.

E quanto a não aparecer nada, só me resta uma coisa:

#foreach( $conta in $contas )
  #foreach( $parcela in $conta.parcelas ) // pode fazer assim
     $parcela.getDataVencimento()&lt;/td&gt;
     $parcela.getValor()&lt;/td&gt;
  #end
#end 

Essas <tds> não me parecem muito certas, que tal abri-las e fechá-las direitinho?

E não se esqueça de verificar com 100% de certeza se a Lists ‘contas’ realmente contém algum valor.

hehehe… era realmente a Key column que estava errada. O Rodrigo(tedLoprao) me deu uma mão…

sobre os tds, eu esqueci de tirar no limpar o código para postar. :wink:

Cara, valeu muito a tua atenção, muito obrigado.

Então corrigindo:

&lt;bag name="parcelas" table="PARCELA" inverse="true" cascade="all-delete-orphan"&gt; &lt;key column="CODPARCELA"&gt; &lt;one-to-many class="br.com.digitins.bean.Parcela"/&gt; &lt;/bag&gt;
para

&lt;bag name="parcelas" table="PARCELA" inverse="true" cascade="all-delete-orphan"&gt; &lt;key column="CODCONTA"/&gt; &lt;one-to-many class="br.com.digitins.bean.Parcela"/&gt; &lt;/bag&gt;

Cara, não me resta mais nada fora a coleção de contas ou parcelas não estar chegando populada até a view :expressionless:

Acho que tu não entendeu… Com a correção do Key Column agora está funcionando normal.