O caso é esse acesso está ficando chato de fazer, em cada um precisamos dizer quais
relacionamentos do objeto precisam ser ‘acordados’ (fetch) senão estoura um LazyInitiationException do
hibernate. Esse código está se tornando em um monte de array de String com o nome do atributo
a ser acordado, e muitas vezes é mais de um nivel…
Então pensei no tal OpenSessionInView, mas o caso é que a view está em outra
máquina, o acesso é remoto, então não dá pra forçar a barra do hibernate e pedir pra ele abrir
a session. Minha esperança é conseguir mudar isso, ao invés do hibernate abrir a session,
customizar e acessar um Facade da minha aplicação por exemplo, que vai até o server, faz a consulta
e retorna. Assim quando ocorrer o get, esse código vai executar e buscar esse dados
sob demanda.
Alguém já teve experiência nisso? Opiniões sobre esta estratégia?
Bom, a minha opinião é a de evitar eager loading. Busque novamente quando precisar de algo. Ou carregue os relacionamentos que você vai utilizar (com cautela).
Como as aplicações desktop tem “menos controle” e mais interações do usuário (ao meu ver), acho que a performance pode cair muito caso você dê muita liberdade no cliente, e esses carregamentos automáticos.
Mas outra idéia, que me veio agora, foi a de abrir e fechar a sessão na thread (com ThreadLocal). De forma análoga ao OSIV web, que funciona abrindo a sessão no inicio da request e fechando ao fim da request.
Éra utilizado o spring para fazer a comunicação com o servidor e muito a contra gosto não utilizamos o lazyloading a favor de um código mais limpo e menos insano. É um pouco chato de montar alguma estratégia porque ao fazer o acesso não éra criado uma sessão no server.
Sua idéia (uma espécie de business delegate esperto, é isso?) parece bacana mas pode dar um pouco de trabalho, seria um desafio interessante.
Ou seja, no primeiro acesso a propriedade (pode ser lista ou referência) busco do banco, na próxima vez não. Assim não
recarrego toda hora e busco somente o que for usado. O que pode acontecer é que uma abertura de
’lookup’ poder ficar mais devagar pois vai acontecer a consulta. Mas a abertura da tela vai ficar mais
rápida pois não carrega tudo. Podemos até balancear isso, o que for mais usado faço antes da abertura
da tela e o restante sob demanda.