Well...também tive esse mesmo problema, e tentei junto com um amigo encontrar alguma solução... segue abaixo um breve resumo da ópera...
/***************************************************************
* ATENÇÃO: E-mail com texto looooonnnggoo....
*
****************************************************************/
Oq acontece No BlazeDS:
No momento de serializar os objetos, todos os atributos sao invocados. (setter/getters tb caso sejam privates)
Como "contornar": setar as colecoes para null.
no Flex:
qnd os objetos serializados chegam do blaze, acontece a mesma coisa no fw do flex com as classes AS3, todos os atributos sao carregados (acho q isso acontece por causa do Bindable, mas nao achei o ponto especificamente dentro do fw)
Tentativa de Resolver o Problema:
Juntamente com um amigo meu, Eduardo Rebola, tentamos...
Criar uma espécie de proxy no flex que faria o carregamento de objetos dos servidor. Esse proxy iria "observar" atributos q tivessem uma meta-tag propria ( [LazyLoad]) e nao invocá-los, setando-os null diretamente.
Somente qnd o getter de um atributo marcado como [LazyLoad] fosse chamado, daí sim disparar uma requisicao para o servidor para carregar os objetos de uma colecao específica. Mas para isso, precisaria de um Command mais genérico e abstrato no lado do java que carregasse qualquer colecao e relacionamento "filho" a partir de uma chave de relacionamento com o "pai".
Bem, esse meu amigo fez algo legal aproveitando o desenvolvimento de um outro framework chamado de Vulcano desenvolvido pela empresa maringaense InsulaTI (
http://blog.insula.com.br/). No entanto, eles optaram por usar o GWT para a camada de visao e nao o Flex, logo, essa implementacao de carregar colecoes foi descontinuada e removida da versao alpha-test do vulcano.
Uma possível soluçao: (sobre a primeira parte que eu comento no meu blog):
Vcs podem tentar criar um serviço genérico que carregue relacionamentos de objetos a partir de uma chave (fk) e depois anexar ao objeto pai (tipo, fazer um attach da coleçao),
E criar um método na sua classe de entidade (ou onde vc quiser) para disparar a requisiçao e invocar o método no servidor.
Algo do tipo:
[Bindable]
[RemoteClass(alias="seu.pacote.java.Usuario.class")]
public class Usuario {
private var id : Number
private var nome : String;
//Aqui é a coleçao
private var permissoes : ArrayCollection
//getter e setter omitidos...
//aqui vc invoca o serviço para carregar a colecao
public function loadCollection(chaveFK : Object) {
//dispara o serviço e pega o resultado
//com o resultado na mao, e nessa classe, vc seta o resultado com o setter da colecao
permissoes = <resultado q veio do servidor>
}
}
Bem... um exemplo bem hipotético, mas na aplicação vc usaria assim:
var usuario : Usuario = new Usuario();
usuario.id //para recuperar/setar o id
usuario.nome //para recuperar/setar o nome
usuario.permissoes // nesse ponto vai estar nulo, pq nao foi carregado a colecao
usuario.loadCollection(
usuario.id); //aqui manda carregar a colecao do servidor, e settar o resultado na colecao
usuario.permissoes // agora vc tem a colecao carregada, pelo metodo invocado na linha anterior.
O problema disso é ter q fazer o loadCollection sempre antes de usar a colecao... oq é muito chato :S
Outras idéias/soluçoes ....
EAGER x OpenSessionInView
Os dois terao o mesmo resultado.... as suas colecoes serao carregadas sempre q o "objeto pai" for carregado.
Logo, usar um filter para o OpenSessionInView é um "fake lazyLoading"!
Se for usar isso, entao use logo o EAGER....
npHibernate:
Ja tentei uma vez, faz tempo, nao carregou colecoes de colecoes... para o meu caso, nao serviu.
GraniteDS:
Também propoes uma solução, mas tive o mesmo problema relatado acima.
Bem... se algu[em mais souber de alguma coisa, outros projetos, ou tem alguma idéia para tentarmos resolver, coloco-me a disposição.
Abraços a todos!
--
Mário de Souza Júnior
Programador Java / Flex : AS3 / PHP
(44) 4009-3550 Maringá-PR
http://blog.mariojunior.comjunin...@gmail.com (gtalk, msn, etc..)