Autor |
Mensagem |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 06/08/2009 15:24:33
|
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
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 06/08/2009 21:26:12
|
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
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 07/08/2009 10:38:19
|
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
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 09/08/2009 22:05:39
|
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
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 10/08/2009 10:56:40
|
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
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 13/08/2009 18:47:28
|
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..
|
|
 |
|