[Logo] Neo Framework Forum
  [Search] Busca   [Recent Topics] Tópicos Recentes   [Members]  Lista de Usuários   [Groups] De volta para a página principal 
[Register] Registrar / 
[Login] Entrar 
@DescriptionProperty Multiplos  XML
Índice dos Fóruns -> Dúvidas
Autor Mensagem
joaopedro
Equipe

Membro desde: 06/08/2009 15:15:51
Mensagens: 3
Offline

Oi Pessoal,


Eu tenho um caso aqui onde são varias tabelas que dependem de outras
para no fim formar o objeto final que eu quero....

Por exemplo, eu tenho a tabela Genero, Marca, Produto e ProdutoEmbalagem e Tipo de Embalagem, onde Produto tem Genero e Marca.... e o ProdutoEmbalagem tem Produto e Tipo de Embalagem.

Porém tanto Produto quanto ProdutoEmbalagem não tem um campo nome para colocar o @DescriptionProperty... tentei colocar em dois mas o Neo da Erro...

Tentei fazer uma junção com toString e também não foi....

Como que eu posso fazer isso?

Att.,
João Pedro
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

Olá joao tudo bom??

Nesse caso o melhor a fazer é um getter transiente que retorne a descricao do objeto e esse getter ser anotado com o descriptionproperty

Dessa forma:
Code:
 @DescriptionProperty
 @Transient
 public String getDescricao(){
     return produto.getGenero() +" "+embalagem.getTipo(); //coloque aqui as propriedades desejadas
 }
 


O Neo sempre que rederizar um combobox por exemplo, irá fazer o menor select possível, isto é.. carregará o menor número de campos possível para ter eficiencia... Os campos sempre serão os campos anotados com @Id e @DescriptionProperty

Veja que estamos utilizando beans mapeados com ManyToOne no método anotado com @DescriptionProperty. Nao é possível o Neo saber quais sao as referencias utilizadas dentro do método, então ele não carregará os campos produto e embalagem...
Mas voce pode informar ao neo que necessita desses campos para formar o description property utilizando o atributo usingFields da @DescriptionProperty

veja o exemplo:

Code:
 @DescriptionProperty(usingFields={"produto", "embalagem"})
 @Transient
 public String getDescricao(){
     return produto.getGenero() +" "+embalagem.getTipo(); //coloque aqui as propriedades desejadas
 }
 


Assim o neo continuará fazendo o select mais eficiente possível, e trará os objetos necessários....

Espero ter solucionado sua dúvida e que esteja gostando do framework

Qualquer dúvida.. basta perguntar no fórum

Até mais
joaopedro
Equipe

Membro desde: 06/08/2009 15:15:51
Mensagens: 3
Offline

Oi Rogel,

Obrigado pela rápida resposta... eu fiz o que me disse....
mas deu uns erros...

Eu fiz assim:

Produto:
Code:
 @DescriptionProperty(usingFields={"genero","marca"})
 @Transient
 public String getDescricao(){
 	return genero.getNome()+" "+marca.getNome();
 }
 


Embalagem:
Code:
 @DescriptionProperty(usingFields={"produto","tipo_embalagem"})
 @Transient
 public String getDescricao() {		
 	return produto.getDescricao()+" "+tipo_embalagem.getNome();
 }
 


Na tela de Cadastrar Embalagem que pega somente a Descrição do
Produto no Combobox aparece perfeitamente.....

Mas na tela de Listagem que já é a união do Produto com o Tipo de
Embalagem ele dá erro do Hibernate....

Invalid property 'descricao' of bean class [com.xxxxx.bean.produto]: Getter for property 'descricao' threw exception. LazyInitializationException: objeto da classe com.xxxxxx.bean.produto não inicializado; nested exception is java.lang.reflect.InvocationTargetException: null null could not initialize proxy - the owning Session was closed

E essa Embalagem também possui um relacionamento com ele mesmo e deu isso aqui na coluna referente a esse relacionamento:

Invalid property 'descricao' of bean class [com.xxxxx.bean.produto_embalagem]: Getter for property 'descricao' threw exception. LazyInitializationException: objeto da classe com.xxxxx.bean.produto_embalagem não inicializado; nested exception is java.lang.reflect.InvocationTargetException: null null could not initialize proxy - the owning Session was closed

Tem idéia do que pode ser?

Att.,
João Pedro
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

Beleza joao....

Seguinte... nos combos o @DescriptionProperty vao funcionar pois o neo irá criar o select...

quando voce tem uma listagem por exemplo.. o select é voce quem monta... entao os dados já chegam prontos no jsp sem chance para o neo carregar..

nesse caso voce deve ir no DAO (ex.: EmbalagemDAO) e sobrescrever o método updateLisagemQuery..

vai ficar mais ou menos assim:
Code:
 public void updateListagemQuery(Query query) {
    query.leftOuterJoinFetch("embalagem.produto produto")
              .leftOuterJoinFetch("embalagem.tipo_embalagem tipo_embalagem");
   
 }
 


Assim o resultado irá trazer o produto e o tipo_embalagem...

Só uma dica... Renomeie seu campo para tipoEmbalagem ao invés de tipo_embalagem.. para seguir o padrao java de nomeclatura...


Se a duvida persistir é só postar aqui.. até mais
joaopedro
Equipe

Membro desde: 06/08/2009 15:15:51
Mensagens: 3
Offline

Oi Rogel,

No produto funcionou sem problema....
eu pedi a Descrição na Listagem e apareceu....

Mas na Embalagem continua com erro de Proxy,
como se não tivesse encontrado a sessão ou coisa do gênero.

Até simplifiquei a listagem pedindo só produto para simplificar
a consulta.... mas negativo....

Deu esse erro na Listagem da Embalagem
Code:
 Invalid property 'descricao' of bean class [com.xxxxx.bean.produto]: Getter for property 'descricao' threw exception. LazyInitializationException: objeto da classe com.xxxxxx.bean.produto não inicializado; nested exception is java.lang.reflect.InvocationTargetException: null null could not initialize proxy - the owning Session was closed  
 


EmbalagemDao
Code:
 @Override
 	public void updateListagemQuery(QueryBuilder<embalagem> query, FiltroListagem _filtro) {
 		query.leftOuterJoinFetch("embalagem.produto produto");
 	}
 


ProdutoDao
Code:
 @Override
 	public void updateListagemQuery(QueryBuilder<produto> query, FiltroListagem _filtro) {
 		query.leftOuterJoinFetch("produto.marca marca")
 		.leftOuterJoinFetch("produto.genero genero");
 	}
 


Para mim quando punha o DescriptionProperty ele fazia as consultas
e uniões, pois tanto que no exemplo de País, Estado e Cidade
funciona sem problema....

Eu andei procurando algumas coisa no google e fala q eu tenho de
chamar a classe produto antes da embalagem.... mas eu não soube
como fazer....

Se puder me dar uma dica....

Agradeço desde já a atenção....

João Pedro
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

Posta a sua tela de listagem que tá dando problema.. pra eu dar uma olhada..
 
Índice dos Fóruns -> Dúvidas
Ir para:   
Powered by JForum 2.1.7 © JForum Team